快速排序 2754: C++习题

题目

以某个数为标准,把比这个数大的都移到它的后面,比这个数小的都移到它的前面,这样它后面的任意一个数都比它前面的任意一个数大,再将这前后两组数再分别重复这一过程,最后就会得到有序的数列;


补充:如果从大到小排列可以将比这个数大的都移到它的前面,比这个数小的都移到它的后面.


快速排序从小到大排序算法描述:


1)设置两个变量first、last,令first等于一组数的第一个数的下标,last等于一组数的最后一个数的下标;


2)以某个数组元素作为关键数据(这里将这组数的第一个数作为关键数据),赋值给key,即key=A[first];


3)从last开始向前搜索,即由后开始向前搜索(last--),找到第一个小于key的值A[last],将A[last]给A[first];


4)从first开始向后搜索,即由前开始向后搜索(first++),找到第一个大于key的A[first],将A[first]给A[last];


5)重复第3、4步,直到first=last,将key的值给a[first];


6)将first两边的两组数分别再进行排序,重复1、2、3、4、5步;直到每组只剩一个数排序结束.




现在,我们的题目来了...




输入一组整数,将这组整数从小到大排列。
*/


#include <iostream>


using namespace std;


int a[100]={0};


void quicksort(int left,int right)
{
    int t;


    if(left>=right)             //当left 与 right 两个数 相等时结束;
        return ;


    int i=left;                    //备份 left要在下次quicksort 做起始边界


    int j=right;                   //备份 right要在下次quicksort 始终止边界




    while (i!=j)
    {
        while (a[j] >=a[left]&&i<j)   (1) //设置左边为参数,那么一定要从右边开始找,因为这决定了在i=j时,
                                                    //与参数交换的是比参数大的数,还是比参数小的数(此题为从小到大,保证每次停止都是
                                                    // 要停到比参数值小数上,让这个数与参数值交换,保证参数值前边的都比参数值小,
                                                    //后边的都比参数值大))

                                     
        {
            j--;                                   //如果从大到小,上边改成<=  下边 改成>=
        }
        while (a[i] <=a[left]&&i<j)
        {
            i++;
        }


        if(i<j)
        {
            t=a[i];
            a[i]=a[j];
            a[j]=t;
        }


    }


    t=a[left];
    a[left]=a[j];
    a[j]=t;


    quicksort(left,i-1);
    quicksort(i+1,right);


}




int main()
{
    int n;
    cin >>n;
    for(int i=1;i<=n;i++)
    cin >>a[i];


    quicksort(1,n);
    for(int i=1;i<=n;i++)
    cout << a[i]<< endl;
    return 0;

}



猜你喜欢

转载自blog.csdn.net/qq_41199502/article/details/80381802