概念:
快速排序是冒泡排序的优化,也是一种基于交换的排序方式。
时间复杂度 O(nlogn)。冒泡的时间复杂度为O(n^2)
基本思想:
主要是采用分而治之,内部采用递归函数
通过一趟排序,先将数据分成两部分,其中一部分的数据,
都比另一部分的数据大(小),(每部分数据内部不要求有序)
然后,对于两部分数据分别进行上述的排序操作,再把每部分数据再分成两部分,
依次类推,直到整个数据有序。
代码实现:
#include <head.h>
#define N 10
//一次排序
int sort(int *s, int low, int high){
//选取一个比较的基准,待排序列中那个都可以
//一般情况下,为方便使用,选择下标最小的
int flag = s[low];
while(low < high){
while(s[high] > flag && low < high){
high--;
}
if(low < high){
s[low] = s[high];
low++;
}
while(s[low] < flag && low < high){
low++;
}
if(low < high){
s[high] = s[low];
high--;
}
}
s[low] = flag; //重新设置基准
return low; //此时 low 和 high 相等
}
//快速排序
int print_sort(int* s, int low, int high){
//递归的出口
if(low < high){
int ret = sort(s, low, high);
print_sort(s, 0, ret-1);
print_sort(s, ret+1, high);
}
}
//遍历
int print_arr(int *s){
int i = 0;
for(i = 0;i < N; i++){
printf("%d ", s[i]);
}
printf("\n");
}
int main(){
int s[N] = {20, 23, 12, 15, 36, 4, 7, 21, 7, 1};
// 排序前
print_arr(s);
//快速排序
print_sort(s, 0, N-1);
printf("------------\n");
//排序后
print_arr(s);
return 0;
}
执行结果: