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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落风雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值