快速排序详解C++

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tyhaotingdege/article/details/86475642

        题目:将乱序数组按从小到大排列。数组中是允许出现重复数字的。

        思路挺简单:

        (1) 在数组中找个基准值(一般取开头/中间/结尾的数值),以该基准值为界限,将小于基准值的数放在基准值左边,大于基准值的值放在基准值右边。

        (2) 基准值左边使用(1)中的方法,递归执行多次后,可以将左边排好。

        (3) 基准值右边也一样,使用(1)中的方法,递归执行多次后,可以将右边排好。

        代码:

#include <stdio.h>
#include <iostream>

/* 取数组最后一位为基准,构建一个新数组,新数组左边小于基准,新数组右边大于基准 */
int separater(int array[], int begin, int LastSubscript)   //数组、数组起始地址、数组最大下标
{
    int key = array[LastSubscript];
    int leftpart = begin -1;
    for(int i = begin; i < LastSubscript; i++)
    {
        if(array[i] <= key)
        {
            leftpart++;
            std::swap(array[leftpart],array[i]);
        }
    }
    std::swap(array[leftpart+1], array[LastSubscript]);
    return (leftpart+1);
}
/* 即是上述“思路”的(2)、(3)步 */
void quicksort(int array[], int begin, int LastSubscript)
{
    int position = 0;
    if(begin < LastSubscript)
    {
        position = separater(array, begin, LastSubscript);
        quicksort(array, begin,position - 1);               //基准值左边递归
        quicksort(array, position + 1, LastSubscript);      //基准值右边递归
    }
}

/* 结果符合从小到大排序要求 */
int main(int argc, char *argv[])
{
    int array[] = {8,5,6,3,1,9,4,4};
    quicksort(array, 0, 7);
    for(int i = 0; i < 8; i++)
    {
        printf("array[%d] is %d:\n", i, array[i]);
    }
}

        快排算法到此介绍结束。算法学习并不是完全为了面试,对程序员的编码能力提升也是很大的,近期将不断学习和分享一些算法博客,现有需求的朋友欢迎查看博主“算法分类”中相关内容。

猜你喜欢

转载自blog.csdn.net/tyhaotingdege/article/details/86475642
今日推荐