快速排序其实是冒泡排序的一种改进,冒泡排序每次对相邻的两个数进行比较,这显然是一种比较浪费时间的。
快速排序之所以比较快,是因为与冒泡排序相比,每次的交换时跳跃式的。
在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是 O(n^2),它的平均时间复杂度为 O ( n log 2 n ) 。
快速排序是分别从两端开始”探测”的,刚开始的时候让哨兵 i 指向序列的最左边,让哨兵 j 指向序列的最右边。
首先哨兵 j 开始出动。
因为此处设置的基准数是最左边的数,所以需要让哨兵 j先出动,这一点非常重要。哨兵 j 一步一步地向左挪动(即 j = j − 1 ),直到找到一个小于基准的数停下来。接下来哨兵 i 再一步一步向右挪动(即 i = i + 1 ),直到找到一个数大于基准的数停下来。
现在交换哨兵i和哨兵j所指向的元素的值。
到此,第一次交换结束。
接下来开始哨兵 j 继续向左挪动(再友情提醒,每次必须是哨兵j先出发),哨兵 i 也继续向右挪动的。重复上述操作,交换等。
当哨兵 i 和哨兵 j 相遇,哨兵 i 和哨兵 j 都走到数x面前。说明此时“探测”结束。
若x小于基准数,将x和基准数进行交换。若x大于基准数,则不换。
重复第一轮的过程。快速排序的每一轮处理其实就是将这一轮的基准数归位,直到所有的数都归位为止,排序就结束了。
void Quick_Sort(int *arr, int begin, int end){
if(begin >= end)
return;
int tmp = arr[begin];
int i = begin;
int j = end;
while(i != j){
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[begin] = arr[i];
arr[i] = tmp;
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
}