C++数据结构-快速排序

#include <iostream>
#define N 12
using namespace std;

/**
*46,74,16,53,14,26,40,53,86,65,27,34从小到大排序
*快速排序
*/

/******************互换两数的值**********************/
void swapNum(int &num1,int &num2)
{
    int temp=num1;
    num1=num2;
    num2=temp;
}
/***************将序列按照轴值一分为2****************/
int partion(int *nums, int low  , int high)
{
    nums[0] = nums[low]; //第一个值作为中轴值,放入nums[0]中,此时low位置空出来了
    while(low < high) //当low和high相遇时,跳出循环
    {
        //第一个while循环,判断最后一个数是否比中轴值大,大的话就不用管它,让他待在中枢值的右边,下一次比较high-1即可
        while(low<high && nums[high] >= nums[0])
            high--;
        //跳出第一个循环,表明此时的下标high对应的值比中轴值小,所以应该待在中轴镇左边,此时互换low和high,此时high位置就空出来
        swapNum(nums[low],nums[high]);
        //换完之后,右边的high位置空出来了,所以现在要从左边开始跟中轴值比较,要是比中轴值小则low++,否则就把这个数填进high位置
        //左边的数小于中轴值,则不动他,它本身就在中轴值左边,此时只需比较low+1和中轴值之间的大小
        while(low<high && nums[low] <= nums[0])
            low++;
        //跳出循环,此时表明low对应的值大于中轴值,此时要互换过来。
        swapNum(nums[low],nums[high]);
    }
    nums[low]=nums[0]; //当low和high相遇时(即跳出循环后),就把轴值填入该位置
    return low; //low此时代表中轴值的位置
}
/******************快速排序(递归)*******************/
void Qsort(int *nums ,int low ,int high)
{
    int pivot;//接收中轴的下标
    if(low<high)
    {
        pivot = partion(nums,low,high);//pivot接收中轴的值,一分为2
        Qsort(nums,low,pivot);         //对低子表递归
        Qsort(nums,pivot+1,high);      //对高子表递归
    }
}
int main()
{
    /**************************************************/
    //初始化
    int nums[N+1]={0,46,74,16,53,14,26,40,53,86,65,27,34};
    /**************************************************/
    //开始快速排序
    Qsort(nums,1,N);//传入第一个low和最后一个high元素的位置
    /**************************************************/
    //打印结果
    for(int i=1;i<=N;i++)
        cout<<nums[i]<<endl;
    /**************************************************/
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43323201/article/details/84822092