zoukankan      html  css  js  c++  java
  • 快速排序(C++实现)

    参考博文链接:https://blog.csdn.net/qq_28584889/article/details/88136498

    当基准数选择最左边的数字时,那么就应该先从右边开始搜索;当基准数选择最右边的数字时,那么就应该先从左边开始搜索。不论是从小到大排序还是从大到小排序!快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。

    #include <iostream>
    #include <vector>
    using namespace std;
    //快速排序(从小到大)
    vector<int> quickSort(int left, int right, vector<int>& arr)
    {
    if(left >= right)
    return {0};
    int i, j, base, temp;
    i = left, j = right;
    base = arr[left]; //取最左边的数为基准数
    while (i < j)
    {
    while (arr[j] >= base && i < j)
    j--;
    while (arr[i] <= base && i < j)
    i++;
    if(i < j)
    {
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    }
    }
    //基准数归位
    arr[left] = arr[i];
    arr[i] = base;
    quickSort(left, i - 1, arr);//递归左边
    quickSort(i + 1, right, arr);//递归右边
    return arr;
    }
    //快速排序(从大到小)
    vector<int> quickSort_1(int left, int right, vector<int>& arr)
    {
    if(left >= right) //递归边界条件
    return {0};
    if(left < 0 || right >= arr.size())
    {
    cout << "error args! array bound." << endl;
    return {-1};
    }//非法输入判断,防止数组越界
    int i, j, base, temp;
    i = left, j = right;
    base = arr[left]; //取最左边的数为基准数
    while (i < j)
    {
    while (arr[j] <= base && i < j)
    j--;
    while (arr[i] >= base && i < j)
    i++;
    if(i < j)
    {
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    }
    }
    //基准数归位
    arr[left] = arr[i];
    arr[i] = base;
    quickSort_1(left, i - 1, arr);//递归左边
    quickSort_1(i + 1, right, arr);//递归右边
    return arr;
    }

    int main()
    {
    vector<int> a,b,c,d;
    a = {2,3,1,5,6,7,9,8};
    b = {2,3,1,5,6,7,9,8};
    c = quickSort(0,7,a);
    d = quickSort_1(0,7,b);
    std::cout << c[0]<<" "<<d[0];
    }

  • 相关阅读:
    注册表修改大全(浏览文章时可以使用CTRL+F查找)
    怎样彻底删除系统服务项
    Linux查看文件编码格式及文件编码转换
    使用回收站主键名、索引名问题
    Aix5.3安装Bash Shell环境
    让AIX下的sqlplus也支持回显功能
    Oracle查看表空间使用率SQL脚本
    笔记本电脑内网、外网一起使用
    Oracle数据库为何出现乱码
    Oracle中varchar2(20)和varchar2(20 byte)区别
  • 原文地址:https://www.cnblogs.com/shiheyuanfang/p/13862576.html
Copyright © 2011-2022 走看看