分治与递归--快速排序

题目描述

实现快速排序算法

参考输入、输出:
输入:输入第一行包括一个整数n,第二行包含n个整数,以空格间隔。
输出:输出一行n个整数,代表排序结果。


Simple input:

4
1 5 4 12

Simple output:

1 4 5 12

题目思路

时间复杂度


题目代码

#include <iostream>
using namespace std;

const int N = 1e5;

int n;
int a[N], b[N];

int Partition(int a[], int p, int r)
{	
    int i = p, j = r + 1;
    int t;
    int x = a[p];    //a[p]做划分基准
    //  将数据分为二部分:左边的元素<=x, 右边的元素>x,x放中间。
    while(1)
    {   
        while(a[++ i] <= x && i < r) ; //从左向右找>x的数的位置下标i,找不到时i==r
  	while(a[-- j] > x) ;            //从右向左找<=x的数的位置下标j,找不到时j==p
  	if(i >= j) break;             //一遍扫描结束, 退出循环
  	t = a[i];
  	a[i] = a[j];
        a[j] = t;
    }
    a[p] = a[j];  //首元素a[p]与a[j] 交换
    a[j] = x;       //x放在分界点
    return j;      //j是分裂位置
}

void QuickSort(int a[], int p, int r)
{
    if(p < r){                                                  
        int q = Partition(a, p, r);
        QuickSort(a, p, q - 1);  // 对左半段排序
        QuickSort(a, q + 1, r);  // 对右半段排序
    }
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++ )
        cin >> a[i];
    
    QuickSort(a, 1, n);

    for(int i = 1; i <= n; i ++ )
        cout << a[i] << " ";
    return 0;
}
posted @   esico  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示