【算法】快速排序——分治算法
程序员文章站
2022-03-24 15:47:49
...
思想
通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
动画演示:
代码
给定你一个长度为n的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
c++
#include<stdio.h>
#include<iostream>
using namespace std;
const int N = 1e6+10;
int n;
int q[N];
void quick_sort(int q[],int l,int r){
if(l>=r) return; //如果集合里面只有一个元素或空元素,那么直接返回
int x = q[l+r >> 2], i=l-1, j= r+1; //可以替换成 (l+r)/2 建议不要写 x=q[l] 这个更耗时间
while(i < j){
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if(i < j) swap(q[i],q[j]);
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&q[i]);
quick_sort(q,0,n-1);
for(int i=0;i<n;i++) printf("%d ",q[i]);
return 0;
}
java
import java.io.IOException;
import java.util.Scanner;
public class Quick_Sort {
static void quickSort(int []q,int l,int r) {
//先找中间的数
if(l>=r) return; //如果集合里面只有一个元素或空元素,那么直接返回
int x = q[l+r >> 1], i=l-1, j= r+1; //可以替换成 (l+r)/2 建议不要写 x=q[l] 这个更耗时间
while(i < j){
do {i++;}while(q[i] < x);
do {j--;}while(q[j] > x);
if(i < j) {
int temp=q[i];
q[i]=q[j];
q[j]=temp;
}
}
quickSort(q,l,j);
quickSort(q,j+1,r);
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int []q=new int [n];
for(int i=0;i<n;i++) q[i]=scanner.nextInt();
quickSort(q,0,n-1);
for (int i = 0; i < n; i++) System.out.print(q[i]+" ");
}
}
上一篇: 分治算法-快速排序