• 快速排序


    基本思想:在快速排序中,记录的比较和交换是从两端向中间进行的,关键字较大的记录一次就能交换到后面单
    元,关键字较小的记录一次就能交换到前面单元,记录每次移动的距离较大,因而总的比较和移动次数较少。

    在排序之前,先设定一个哨兵值,一般选择a[0],将其值赋给一个临时变量:x=a[0];然后开始左右移动下标i、j值;

    直到(a[i]>=x且a[j]<=x)或(i>=j)停止.交换a[i]、a[j]的值

    继续移动下标i、j值,直到(a[i]>=x且a[j]<=x)或(i>=j)停止.

    交换a[p] 和 a[j]的值
     a[p] = a[j] ,a[j] = x

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    
    //,产生m到n的随机数,把范围[m,n)改变到[0,X),到最后再转移回去。三种情况
    int Random(int m, int n)
    {
            int pos, dis;
            if(m == n)
            {
                return m;
            }
            else if(m > n)
            {
                pos = n;
                dis = m - n + 1;
                return rand() % dis + pos;
            }
            else
            {
                pos = m;
                dis = n - m + 1;
                return rand() % dis + pos;
            }
    }
    
    int Partition(int a[],int p,int r)
    {
        int i = p,j = r+1;
        int x = a[p]; //哨兵
        //将小于x的元素交换到左边区域,将大于x的元素交换到右边区域
        while(true)
        {
            while(a[++i] < x && i < r);
            while(a[--j] > x);
            if(i >= j) break;
            swap(a[i],a[j]);
        }
        a[p] = a[j];
        a[j] = x;
        return j;
    }
    
    //在数组中随机选取一个元素作为划分基准,
    //这样是划分基准的选择是随机的,从而可以期望划分是较对称的
    int RandomPartition(int a[],int p,int r)
    {
        srand((int)time(NULL));
        int i = Random(p,r);
        swap(a[p],a[i]);
        return Partition(a,p,r);
    }
    
    void QuickSort(int a[],int p,int r)
    {
        if(p < r)
        {
            int q = RandomPartition(a,p,r);
            QuickSort(a,p,q-1);
            QuickSort(a,q+1,r);
        }
    }
    
    int main()
    {
        int n,a[100];
        cout << "请输入要排序的元素的个数:";
        cin >> n;
        cout << "请输入要排序的元素:";
        for(int i = 0; i < n; i++)
            cin >> a[i];
        QuickSort(a,0,n-1);
        for(int i = 0; i < n; i++)
            cout << a[i] << " ";
        cout << endl;
        return 0;
    }
  • 相关阅读:
    java基础之多线程一:概述
    java基础之io流总结四:字符流读写
    java基础之io流总结三:字节流读写
    java基础之io流总结二:File类基本应用
    java基础之io流总结一:io流概述
    java基础之集合:List Set Map的概述以及使用场景
    java基础之集合长度可变的实现原理
    HDU 4770 Lights Against Dudely 暴力枚举+dfs
    HDU 4771 BFS + 状压
    Codeforces Round #269 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/cjshuang/p/5183577.html
Copyright © 2020-2023  润新知