快速排序 C&&C++

快排算法
快排和冒泡都是基于交换的思想,但是进行了改进,更为高效。
 
流程:
(1)首先设定一个分界值,通过分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。
(3)左右两个部分重复上述排序。
 
从上述流程可以看出,这就是一个递归的过程,递归终止即只有一个元素
 
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
void QuickSort(int *a,int left,int right)
{
    int rt,lt,t,base;
    rt=right;                           //rt为分界值分界后的左半部分的右边界
    lt=left;                            //lt为分界值分界后的右半部分的左边界
    base=a[left];                 
/*这里定义分界值,这个分界值定在哪里都是可以的,定在中间更为直观,若定在其他地方,手动排一下就知道,边界值会换到中间去,和定在中间一个样*/
    while (lt < rt)
    {
        while(a[lt] < base) lt++;       //从左边开始寻找大于分界值的值
        while(a[rt] > base) rt--;       //从右边开始寻找小于分界值的值
        if(lt < rt)                               /*lt小于rt,就交换这两个的值,lt与rt必不会在边界值同一侧,手动按照算法排一下就知道,lt或rt到了边界值的时候就会停下来,交换的时候就会把边界值换到中间去了*/
        {
            t = a[lt] ;
            a[lt] = a[rt] ;
            a[rt] = t ;
            lt++;
            rt--;
        }
    }
    if(lt == rt) lt++;                  //此处为了避免两个边界模糊不清
    if( left < rt ) QuickSort(a,left,rt);       //递归对左半部分排序
    if( right > lt) QuickSort(a,lt,right);    //递归对右半部分排序
    
}
int main()
{
    srand(time(NULL));
    int n;
    cout<<"Please cin the size of array:"<<endl;//输入数组的大小
    cin>>n;
    int a[n];
    cout<<"Array before sorting is:"<<endl;
    for (int i = 0; i < n; i++)                                 //利用随机数输入数组
    {
        a[i]=rand()/1000;
        cout<<a[i]<<" ";
    }
    cout<<endl;
    QuickSort(a,0,n-1);
    cout<<"Array after sorting is:"<<endl;            //输出排序结果
    for (int i = 0; i < n; i++) cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Arthas8086/p/11949001.html