快速排序
快速排序是分区交换,属于交换排序,是冒泡排序的改进。
当待排序的关键字是随机分布时,快速排序的平均时间最短。
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。步骤为:
- 从数列中挑出一个元素,称为”基准”(pivot),
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
- 递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
//平均时间复杂度O(n^2)
//空间复杂度O(logn)~O(n)
//最优时间复杂度O(nlogn)
//最坏时间复杂度O(n^2)
//不稳定
#include <stdio.h>
void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int Partition(int a[], int low, int high){
int pivotkey;
pivotkey = a[low];
while (low < high) {
while (low < high && a[high] >= pivotkey) {
high--;
}
a[low] = a[high];
while (low < high && a[low] <= pivotkey) {
low++;
}
a[high] = a[low];
}
a[low] = pivotkey;
return low;
}
void QuickSort(int a[], int low, int high){
int pivotkey = a[low];
if (low < high) {
pivotkey = Partition(a, low, high);
QuickSort(a, low, pivotkey-1);
QuickSort(a, pivotkey+1, high);
}
else{
return;
}
}
int main()
{
int a[8];
printf("Please input the number:\n");
for(int i=0;i<8;i++)
scanf("%d",&a[i]);
QuickSort(a, 0, 7);
for (int i=0; i<8; i++) {
printf("%d\n",a[i]);
}
return 0;
}