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分钟学会快速排序(分治思想)的主要内容,如果未能解决你的问题,请参考以下文章