5分钟学会快速排序(分治思想)

Posted 洛陨尘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5分钟学会快速排序(分治思想)相关的知识,希望对你有一定的参考价值。

快速排序

快速排序(Quicksort)是对冒泡排序算法的一种改进(先排序再递归)

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

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

重要思想

  • 确定分界点:q [ l ],q[ l + r >> 1],q[ r ]
    在这里我们取左边界为l,右边界为r,中间值为 l+r >> 1
    任意选择一种分界点就行,在取中间值的时候(左边界+右边界右移1)便是除以2
  • 调整区间:关键码我们设立为x,将小于等于x的放于左边区间,将大于等于x的放于右边区间
  • 递归处理:对我们所有的数进行多次分界处理就实现了我们的排序
  • 难点:在快速排序中难点就是对于下标的控制,如何让我们跳出递归

C++实现快速排序代码

#include<iostream>
using namespace std;
const int N = 1e5+10;
int arr[N];
void quick_sort(int arr[],int l,int r)

    if(l>=r)return;
    int i=l-1,j=r+1,x=arr[l+r>>1];
    while(i<j)
    
        do i++;while(arr[i]<x);
        do j--;while(arr[j]>x);
        if(i<j)swap(arr[i],arr[j]);
    
    quick_sort(arr,l,j);
    quick_sort(arr,j+1,r);

int main()

    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>arr[i];
    quick_sort(arr,0,n-1);
    for(int i=0;i<n;i++)
    cout<<arr[i]<<" ";

Java实现快速排序代码

import java.util.Scanner;
public class Main 
    public static void main(String[] args) 
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		int [] arr= new int[n];
		for(int i=0;i<n;i++)
		arr[i]=sc.nextInt();
		quick_sort(arr,0,n-1);
		for(int i=0;i<n;i++)
		System.out.print(arr[i]+" ");
	
    private static void quick_sort(int[] arr, int l, int r) 
    
        if (l >= r)return;
        int i = l - 1, j = r + 1, x = arr[l + r >> 1];
        while (i < j) 
            do i++;while (arr[i] < x);
            do j--;while (arr[j] > x);
            if (i < j)
                int tmp;
                tmp=arr[i];
                arr[i]=arr[j];
                arr[j]=tmp;
            
        
        quick_sort(arr, l, j);
        quick_sort(arr, j + 1, r);
    

以上是关于5分钟学会快速排序(分治思想)的主要内容,如果未能解决你的问题,请参考以下文章

5分钟学会快速排序(分治思想)

三分钟彻底理解快速排序

上个厕所的功夫,就学会了“快速排序”算法

排序算法快速排序

大佬的快速排序算法,果然不一样

由快速排序到分治思想