快速排序
快速排序是一种高效且使用广泛的排序算法,使用分治法策略来把一个串行分为两个串行
算法步骤:
- 从数列中挑出一个元素,称为“基准”
- 重新排序数列,所有元素比基准小的摆放在基准前面,所有元素比基准值大的摆放在基准的后面(相同的数可以放一边)。这个分区退出之后,改基准就处于序列的中间位置
- 递归地把小于基准元素的子数列和大于基准元素的子序列排序
代码实现:
C++代码实现:
split算法实现:使用单向指针对数组进行遍历,首先将数组首元素设置为基准元素,然后再将第二个开始的元素依次与基准元素比较
void swap(int &a, int &b){
int t = a;
a = b;
b = t;
}
int split(int arryNum[], int low, int high){
int baseIndex = low; //基准值索引
int baseNum = arryNum[baseIndex]; //基准值
for(int j = low + 1; j <= high; j++){
if(arryNum[j] <= baseNum){
baseIndex++;
//std::cout << "baseIndex: " << baseIndex << " baseIndexNum: " << arryNum[baseIndex]<< std::endl;
//std::cout << "j: " << j << " jNum: " << arryNum[j]<< std::endl;
swap(arryNum[baseIndex], arryNum[j]);
}
}
swap(arryNum[low], arryNum[baseIndex]);
return baseIndex;
}
void quick_sort(int a[], int low, int high){
if(low < high){
int index = split(a, low, high);
quick_sort(a, low, index - 1);
quick_sort(a, index + 1, high);
}
}
partiton算法实现:partiton算法使用头尾两个方向相反的指针进行遍历,先将数组的第一个元素设置为比较元素,头指针从左到右找到第一个比基准元素大的数,尾指针从右至左找到第一个小于基准元素的数,全部交还完毕后将基准元素放到中间位置。
int partiton(int arryNum[], int low, int high){
int baseNum = arryNum[low];
int left = low;
int right = high;
while(left < right){
while(left < right && arryNum[right] >= baseNum)
right--;
while(left < right && arryNum[left] <= baseNum)
left++;
if(left != right)
swap(arryNum[left], arryNum[right]);
}
swap(arryNum[low], arryNum[left]);
return left;
}