本文介绍: 快速排序(Quick Sort)是一种高效的排序算法,采用了分治的思想。它选择一个基准元素,通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比基准元素小,另一部分的所有元素都比基准元素大,然后再对这两部分继续进行排序,以达到整个序列有序。
0. 简介
快速排序(Quick Sort)是一种高效的排序算法,采用了分治的思想。它选择一个基准元素,通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比基准元素小,另一部分的所有元素都比基准元素大,然后再对这两部分继续进行排序,以达到整个序列有序。
1. 快速排序的实现
快速排序的基本思想:
- 选择一个基准元素(pivot),通常选择序列的第一个元素。
- 将序列中所有比基准元素小的元素放在它的左边,所有比基准元素大的元素放在它的右边。这个过程称为“分区”(Partitioning)。
- 对基准元素的左边和右边的两个子序列分别进行快速排序。
- 递归地进行以上步骤,直到所有子序列的长度为1,即整个序列有序。
快速排序过程演示:
2. 快速排序时空间复杂度分析
-
空间复杂度:
以上分析是基于常见的快速排序实现方式,实际应用中可能会根据具体情况进行优化,从而改变时间复杂度和空间复杂度的性质。
3. 快速排序C语言代码
C代码实现:
#include <stdio.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int partition(int array[], int low, int high) {
int pivot = array[low]; // 基准元素
while (low < high) {
// 从后往前找到第一个小于基准元素的元素
while (low < high && array[high] >= pivot) {
high--;
}
array[low] = array[high]; // 将这个元素放到左边
// 从前往后找到第一个大于基准元素的元素
while (low < high && array[low] <= pivot) {
low++;
}
array[high] = array[low]; // 将这个元素放到右边
}
array[low] = pivot; // 基准元素归位
return low; // 返回基准元素的位置
}
void quickSort(int array[], int low, int high) {
if (low < high) {
int pi = partition(array, low, high); // 获取基准元素位置
quickSort(array, low, pi - 1); // 对基准元素左边的子序列进行递归排序
quickSort(array, pi + 1, high); // 对基准元素右边的子序列进行递归排序
}
}
int main() {
int data[] = {8, 7, 2, 1, 0, 9, 6}; // 待排序的数组
int n = sizeof(data) / sizeof(data[0]); // 数组长度
quickSort(data, 0, n - 1); // 快速排序
printf("Sorted array in ascending order: n");
for (int i = 0; i < n; ++i) {
printf("%d ", data[i]); // 输出排序后的数组
}
return 0;
}
代码解释:
swap
函数用于交换两个整数的值。partition
函数是快速排序的核心部分,它实现了对待排序数组的分割。函数首先选取数组的第一个元素作为基准元素,然后从数组的末尾开始向前寻找第一个小于基准元素的元素,再从数组的开头开始向后寻找第一个大于基准元素的元素,然后交换这两个元素的位置。这个过程会一直重复,直到两个指针相遇。相遇时的位置就是基准元素应该放置的位置。此时,基准元素左边的所有元素都小于它,右边的所有元素都大于它。最后返回基准元素的位置。quickSort
函数是一个递归函数,它首先调用partition
函数获取基准元素的位置,然后分别对基准元素的左右两边的子序列进行递归排序。递归的结束条件是子序列的长度小于等于1,也就是子序列已经是有序的。
4. 快速排序代码运行结果
代码运行结果:
原文地址:https://blog.csdn.net/Liu_eight_nine/article/details/134764042
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_36380.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。