欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【算法】快速排序——分治算法

程序员文章站 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]+" ");
			
	}

}

相关标签: 算法 算法