快速排序算法是比较经典的排序算法。
但其中心思想还是比较简单的,就是“挖坑”和“填坑”的过程。
这里的“坑”经常会被随机化,以防止快排的最坏情况出现。当然,我们拿到一个数列后,也可以先将该数列整体随机化,从而避免每次都要随机“选坑”。
今天重新复习了一下,也总结了不同形式的快排~总结如下:
1. 常见的快速排序形式:
#include <iostream>
using namespace std;
void quickSort(int *array, int Begin, int End)
{
if(Begin<End)
{
int begin = Begin;
int end = End;
int temp = array[end];//挖坑
while(begin<end)
{
while(begin<end && array[begin]<=temp) begin++;
if(begin<end) array[end--] = array[begin]; //从前向后填坑
while(begin<end && array[end]>=temp) end--;
if(begin<end) array[begin++] = array[end]; //从后向前填坑
}
array[begin]=temp; //填上“中间”的坑
quickSort(array, Begin, begin-1);//递归
quickSort(array, begin+1, End);
}
}
//输出数组
void printArray(int *array, int length)
{
for(int i=0; i<length; i++)
cout<<array[i]<<"\t";
cout<<endl;
}
int main()
{
int array[5]={4, 2, 1, 7, 5};
printArray(array, 5);
quickSort(array, 0, 5);
printArray(array, 5);
system("pause");
return 0;
}
2.另一种形式(见《剑指offer》P64)
int Partion(int data[], int length, int start, int end)
{
if(data == NULL || length<=0 || start<0 || end >=length)
throw new std::exception("Invalid Parameters");
int index = RandomInRange(start, end);//挖坑
Swap(&data[index], &data[end]);
int small = start-1; //small变量的设置是它与传统快排最大的不同之处
for(index = start; index < end; ++ index)
{
if(data[index] < data[end])
{
++small; //small总是指向比“坑”中数字大的前一个数字
if(small != index)
Swap(&data[index], &data[small]);
}
}
++small;
Swap(&data[small], &data[end]);
return small;
}
void QuickSort(int data[], int length, int start, int end)
{
if(start == end) return;
int index = Partion(data, length, start, end);
if(index > start) QuickSort(data, length, start, index-1);
if(index < end) QuickSort(data, length, index+1, end);
}