快速排序(双端排序)

快速排序排序的思想是,首先设置一个key,我们通常将待排序的数组的第一个元素设置为key,紧接着从待排序的两端设置两个“哨兵”,一个从后往前进行扫描,一个从前往后进行扫描,当“哨兵j”从后往前进行扫描的过程中,当其数值大于

key不用处理,继续扫描,如果遇到的当前数值小于key,则将当前数值赋给i目前所在位置的数值(覆盖),并且j目前的数值不变化,i哨兵从前往后扫描同理,直到i=j此时第一次扫描结束,将key的数值赋予该位置(i=j)。再将该位置左右分成

两个分别进行递归调用。

参考博客:https://blog.csdn.net/nrsc272420199/article/details/82587933?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-82587933.nonecase&spm=1018.2226.3001.4187

 

注意:在进行快速排序的代码书写应当注意几点细节:

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++;
    }
}

 

posted @ 2021-12-03 12:55  小康规划  阅读(210)  评论(0)    收藏  举报