#include <stdio.h>
/*
*快速排序的实现复杂度为O(nlogn),每次low和high整体的相遇次数都为n次,二分的次数为logn。
*故而整体的时间复杂度为O(nlogn),最好和平均都为O(nlogn),最坏时间复杂度为O(n*n),当数组有序时取到
*空间复杂度为logn,每次递归时参数需要空间。递归次数为logn*/
void swap(int &a, int &b) {
int temp;
temp = a;
a = b;
b = temp;
}
//排序往往都是两层循环,优先去写内层循环再去写外曾循环
void BubbleSort(int *a, int len) {
for (int i = 0; i < len; ++i) {//控制有序数的数目
bool flag = false;//哨兵,如果一轮都没有进行交换那么说明数组已经有序
for (int j = 0; j < len - i; ++j) {//负责交换
if (a[j] > a[j + 1]) {
swap(a[j], a[j + 1]);
flag = true;
}
}
if (flag == false) {
break;
}
}
}
//挖坑法
int partition(int *a,int low,int high){
int pivot=a[low];
while (low<high){
while (low<high&&a[high]>=pivot)//当low小于high且右边的元素大于pivot时可以移动high指针
high--;
a[low]=a[high];//将a[low]的值覆盖
while (low<high&&a[low]<=pivot)//当low小于high且左边元素小于pivot是可以移动low指针
low++;
a[high]=a[low];//将a[high]的值覆盖
}
a[low]=pivot;//将pivot的值重新装回数组,high和low这时候重叠
return low;
}
void QuickSort(int *a,int low,int high){
int pivotPos=0;
//当只有一个元素的时候停止快速排序
//需使用if,否则会有循环无法退出的情况
if (high>low){
//将比选定元素大的放在左边,将比选定元素大的放在右边
pivotPos=partition(a, low, high);
//选定元素已经有序,不需要再排列
QuickSort(a, low, pivotPos - 1);//对左边的元素进行快排
QuickSort(a, pivotPos + 1, high);//对右边的元素进行快排
}
}
int main() {
int a[13] = {24, 49, 11, 223, 44, 55, 675, 321, 1, 99, 3, 42, 242};
QuickSort(a,0,sizeof a/sizeof(a[0])-1);
printf("after quick sort\n");
for (int i = 0; i < sizeof a / sizeof(a[0]); ++i) {
printf("%-4d", a[i]);
}
return 0;
}
快速排序QuickSort
最新推荐文章于 2024-07-25 23:26:35 发布