快速排序
思路:
选定一个基准数,每次一轮排序完成后要满足基准数左边的都是比它小的数,右边的都是比它大的数。然后再分别对左表和右表进行同样的操作,直到所有排序完成。其实不难发现,每一轮排序都使得一个数(基准数)放在了它“正确的”位置上。
时间复杂度:
O(nlogn)至O(n2),平均时间复杂度为O(nlogn)
代码:(这里给出了每一轮排序后的情况,直到最后的排序完成)
1 #include<stdio.h> 2 int a[110]; 3 int n; 4 int Partition(int *a, int low, int high) //返回每排一次序后基准数的位置 5 { 6 int keynum; //基准数 7 8 a[0] = a[low]; 9 10 keynum = a[0]; 11 12 while(low < high) 13 { 14 while(low < high && a[high] >= keynum) //从右往左找第一个比keynum小的数 15 high--; 16 17 a[low] = a[high]; //找到后就将这个数移到前面low指向的位置 18 19 while(low < high && a[low] <= keynum) //从左往右找第一个比keynum大的数 20 low++; 21 22 a[high] = a[low]; //找到后就将这个数移到后面high指向的位置 23 } 24 25 a[low] = a[0]; //基准数归位 26 27 return low; //return high也是一样的 28 } 29 30 void Qsort(int *a, int low, int high) //递归实现快排 31 { 32 if(low < high) //low == high时,即子表只剩一个元素 33 { 34 int pivotloc = Partition(a, low, high); 35 for(int i = 1; i <= n; i++) 36 printf("%d ", a[i]); 37 printf("\n"); 38 39 Qsort(a, low, pivotloc - 1); //对左子表实现排序 40 Qsort(a, pivotloc + 1, high); //对右子表实现排序 41 } 42 } 43 44 int main() 45 { 46 scanf("%d", &n); 47 48 for(int i = 1; i <= n; i++) 49 scanf("%d", &a[i]); 50 51 Qsort(a, 1, n); 52 53 /*for(int i = 1; i <= n; i++) 54 printf("%d ", a[i]); 55 printf("\n");*/ 56 57 return 0; 58 }