栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++快速排序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++快速排序

快速排序源代码
#include 
#include 

using namespace std;
const int N = 100000;
int a[N];


void quick_sort(int a[], int l, int r)
{
    if(l >= r)
        return;
    int x = a[ l + r >> 1];
    int i = l - 1, j = r + 1;
    while(i < j)
    {
        do i++;
        while(a[i] < x );
        do j--;
        while(a[j] > x);
        if(i < j) 
            swap(a[i], a[j]);
    }
    quick_sort(a, l, j);
    quick_sort(a, j+1, r);
}
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    quick_sort(a, 0, n - 1);
    for(int i = 0; i < n; i++) printf("%d ", a[i]);
    return 0;
}
区间问题?
    quick_sort(a, l, j);
    quick_sort(a, j+1, r);//这个可以AC
  两个的区别是啥呢?
    quick_sort(a, l, i-1);
    quick_sort(a, i, r);//这个不能AC
    这个区间问题和mid的取值是相互对应的,如果mid = a[l + r >> 1],此时取值在左边,如果排序符合从小到大的顺序,则最终扫描完一遍之后,指针指向mid的位置,两个数的话,就会在最左边,所以使用 i- 1会越界,应该采用j和j + 1。
    如果mid = a[l + r  + 1 >> 1],此时对满足条件的序列指针会指向右侧,指向右侧就采用i - 1和i。
解答:
#include 
#include 
using namespace std;

const int N = 100000;
void quick_sort(int a[], int i, int j)
{
   if(i >= j) return;
   int x = a[i + j + 1 >> 1];
   int l = i - 1, r = j + 1;
   while(l < r)
   {
       do l++;
       while(a[l] < x);
       do r--;
       while(a[r] > x);
       if(l < r) swap(a[l], a[r]);
   }
   quick_sort(a, i, l-1);
   quick_sort(a, l, j);
}
int da[N];
int main()
{
   int n;
   cin >> n;
   for(int i = 0; i < n; i++) scanf("%d", &da[i]);
   quick_sort(da, 0, n - 1);
   for(int i = 0; i < n; i++) printf("%d ", da[i]);
   return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968670.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号