zoukankan      html  css  js  c++  java
  • 分治法快排

    //快速排序,第一步确定一个关键值key(一般设置为第一个元素),一次快排基本思路是将比key小的数放在key的左边将比key大的数放在key右边,于是完成一次快排

    接下来对key左边和右边分别递归采用同样方法

    算法步骤:

       1.选择一个基准key(一般选第一个元素)

       2设定两个指针low和high,初始指向第一个元素和最后的一个元素

       3.先将high从右向左扫描直到找到比key小的元素,将此元素移到low位置,然后low从左向右扫描,找到比key大元素移动到high的位置

       一次快排结束的条件为low==high

       4.尾部工作,将key插到low位置

       5对low左边右边分别递归,重复以上做法

    算法复杂度为O(nlogn)

    #include<iostream>;
    using namespace std;
    void Qsort(int*list, int left, int right);
    int main(){
    int n,i;
    while (cin >> n){
    int *a = new int[n];
    for (i = 0; i < n; i++)
    cin >> a[i];
    Qsort(a, 0, n - 1);
    for (i = 0; i < n; i++)
    cout << a[i] << " ";
    cout << endl;
    return 0;
    }
    }
    void Qsort(int*list, int left, int right){
    /*退出条件*/
    if (left >= right)
    return;
    //设置关键值
    int key = list[left];
    //两个指针左右扫描
    int low = left, high = right;
    while (low < high){/*一次扫描结束标志*/
    /*找到右边比key大的数*/
    while (list[high]>=key&&high > low)
    high--;
    list[low] = list[high];//找到后移到低端
    /*找出左边比key小的数*/
    while (list[low]<= key&&high>low)
    low++;
    list[high] = list[low]; //找到后移到高端
    }
    list[low] = key;//最后一步将k插入,此时一次快排完毕
    /*对两个子序列分别递归重复以上方法*/
    Qsort(list, left, low-1);
    Qsort(list, low+1,right);
    }

  • 相关阅读:
    1775. [国家集训队2010]小Z的袜子
    面试经典-分金条
    你的话信用度太低,说出来就像喝水一样容易
    uvalive 3971
    lua学习:使用Lua处理游戏数据
    每一次量体重。轻了就对自己说:瘦了。重了就对自己说: 胸部大了
    啊华北哦好咕~~(╯﹏╰)b
    啊别怪我好
    阿尔宾观海卫哦
    面试经典--两个房间 每间房间三盏灯
  • 原文地址:https://www.cnblogs.com/td15980891505/p/4451614.html
Copyright © 2011-2022 走看看