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

快速排序

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

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

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

重要思想

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

C++实现快速排序代码

#include
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);
    }
}

你可能感兴趣的:(Java,笔记,新星计划,算法,java,快速排序)