快速排序(双端排序)
快速排序排序的思想是,首先设置一个key,我们通常将待排序的数组的第一个元素设置为key,紧接着从待排序的两端设置两个“哨兵”,一个从后往前进行扫描,一个从前往后进行扫描,当“哨兵j”从后往前进行扫描的过程中,当其数值大于
key不用处理,继续扫描,如果遇到的当前数值小于key,则将当前数值赋给i目前所在位置的数值(覆盖),并且j目前的数值不变化,i哨兵从前往后扫描同理,直到i=j此时第一次扫描结束,将key的数值赋予该位置(i=j)。再将该位置左右分成
两个分别进行递归调用。
注意:在进行快速排序的代码书写应当注意几点细节:
1、递归终止条件:
递归终止条件为,
int * Sorted(int a[],int low ,int high)
if (high > low)
{
int key = GetIndex(a, low, high);
Sorted(a, key+1, high);
Sorted(a, low, key - 1);
}
当传入的high比low还小的时候,不执行函数体
2、三个while循环
int GetIndex(int a[],int low, int high) { int key = a[low]; while (high > low) {
//j哨兵的循环体
while (high > low&& a[high] >= key) { high--; } a[low] = a[high];
//i哨兵的循环体
while (high > low&& a[low] <= key) { low++; } a[high] = a[low]; } a[low] = key; return low; }
三个while判断的综合作用用于防止j哨兵扫到i哨兵之前,因为当j哨兵和i哨兵碰头时,此次扫描结束
代码:
#include<iostream> using namespace std; //快速排序 int GetIndex(int a[],int low, int high) { int key = a[low]; while (high > low) { while (high > low&& a[high] >= key) { high--; } a[low] = a[high]; while (high > low&& a[low] <= key) { low++; } a[high] = a[low]; } a[low] = key; return low; } int * Sorted(int a[],int low ,int high) { if (high > low) { int key = GetIndex(a, low, high); Sorted(a, key+1, high); Sorted(a, low, key - 1); } return a; } int main() { int a[] = { 2,6,5,4,7 }; int* b = Sorted(a,0,4); int i = 0; while (i < 5) { cout << *b << endl; b++; i++; } }

浙公网安备 33010602011771号