算法的独家记忆--快速排序

本文深入探讨快速排序算法的核心思想、实现步骤及注意事项。包括如何通过一趟排序将数据分割成独立两部分,以及实现中易错点的防范措施。同时提供一段简单的快速排序代码实现,帮助读者理解算法细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法思想:

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

实现分析:

1.每次将基准数排到他正确的位置(p),并保证其大于它左边的数小于它右边的数。2.并递归排序它左右两边的部分,递归出口:左界价表>=右界下标。

1段的实现:有这列数中选出一个基准数,如:第一个元素。然后,通过下标i从左往右遍历这些数,找到不小于基准的数和下标j从右向左遍历找出的不大于基准的数,两者交换位置。注意下标的界限保证。遍历出的i  >=  j的时候,j就是基准正确的位置。之前的循环也保证了比基准小的数在前,大的数在后面。

2段的实现:标准的递归调用,不作过多说明。

贴一段简单的实现:

public class QuickSort {

    public static void sort(int[] a, int l, int r){

        if(l > r) return;
        int p = partition(a, l, r);
        sort(a, l, p-1);
        sort(a, p+1, r);
    }
    private static int partition(int[] a, int l, int r) {
        int key = a[l];
        int i = l ;
        int j = r + 1 ;
        for(;;){
            while(a[++i] < key && i < r);
            while(a[--j] > key );
            if(j > i){
                  int temp = a[i];
                  a[i] = a[j];
                  a[j] = temp;
            }else{
                  a[l] = a[j];
                  a[j] = key;
                  return j;
            }
        }
    }
}

注意红色部分的地方,若使用不当,或漏写程序很可能有下标越界错误!

在贴一个算法导论里的实现:

public int paratition(int[] a ,int l, int r){
int i = l - 1 ;
int x = a[r];
for(int j=l; j<=r-1; j++){
if(a[j] <= x){                       
i = i + 1;                  
swap(a, i, j);
}
}
i = i + 1;
swap(a, i, r);
return i;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值