785. 快速排序[编程语言教程]

 

题目描述

给定你一个长度为n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在1~109

范围内),表示整个数列。

输出格式

输出共一行,包含 n 个整数,表示排好序的数列。

数据范围

1 ≤ n ≤ 100000

1≤n≤100000

输入样例

5

3 1 2 4 5

输出样例

1 2 3 4 5

 

思路

  快速排序时间复杂度O(N*logN),其思想是分治法,

  该方法的基本思想是:

  1.先从数列中取一个数k作为基准数(一般是数列的第一个数或中间那个数);

  2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边.

  ①k为第一个数:设一个头指针i(此时i指向k),尾指针j,当i<j时,先从数列末端往前(j–)找到第一个小于k的数,将j指向的那个值放到i的位置,然后从i往后(i++)找到第一个大于k的数,将i指向的那个值放到j的位置. 直到最后i==j,k就放到这个位置;

  ②k为中间那个数:设一个头指针i,尾指针j,当i<j时,i向后移动直到i指向的数≥k,j向前移动直到j指向的数≤k,此时若i<j则将它们指向的两个数交换,然后继续重复这个步骤,直到i>=j;

  3.再对左右区间重复第二步,直到各区间只有一个数;

 

  一般我选择第一个数作为基准值,不过在这里超时了,代码如下——

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 using namespace std;
 5 int q[100005];
 6 
 7 void quickSort(int l, int r) {
 8     if(l>=r) return;
 9     int i=l, j=r, k=q[l];
10     while(i<j) {
11         while(i<j && q[j]>=k) j--;
12         q[i]=q[j];
13         while(i<j && q[i]<=k) i++;
14         q[j]=q[i];
15     }
16     q[i]=k;
17     quickSort(l, i-1);
18     quickSort(i+1, r);
19 }
20 
21 int main() {
22     int n;
23     cin>>n;
24     for(int i=0; i<n; i++) cin>>q[i];
25     quickSort(0, n-1);
26     for(int i=0; i<n; i++) cout<<q[i]<<‘ ‘;
27 }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 785. 快速排序