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

思想

通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

步骤

(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]+" ");
			
	}

}

猜你喜欢

转载自blog.csdn.net/Black_Customer/article/details/109579539
今日推荐