数据结构-快速排序

快速排序

1.快速排序的原理

  1. 从如图所示待排序区间中选择一个数,作为基准值(pivot),例如选择0号下标的6作为基准值放入tmp中;

在这里插入图片描述

  1. 遍历整个待排序的区间,将比基准值小的(可以包含相等的)放到基准值的左边,比基准值大的(可以包含相等的)放到基准值的右边;
    在这里插入图片描述

  2. 当low与high相遇时,此时找到基准,并采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度等于1,代表已经有序,或者小区间的长度等于0,代表没有数据;
    在这里插入图片描述

在这里插入图片描述

基准值的左边已经有序,以同样的方式处理右边。

2.快速排序的代码实现

public static int pivot(int[] array,int start,int end){
  int tmp = array[start];
  while(start<end){
     while(start < end && array[end] >= tmp){
     end--;
     }
     array[start]=array[end];
    //把数据赋值给start
     while(start < end && array[end] <= tmp){
     start++;
     } 
//把start下标的值给end 
  array[start] = tmp;
  return start;
}
public static void quick(int[] array,int low,int high){
    if(low < high){
    int piv = pivot(array,low,high);
    qucik(array,low,piv-1);
    qucik(array,piv+1,high );
    }
}
public static void quickSort(int[] array){
    quick(array,0,array.length-1);
}

测试代码:

public static void main(String[] args){
  int[] array = {13,5,22,7,14,54,65,157};
  System.out.println(Arrays.toString(array));
  quickSort(array);
 System.out.println(Arrays.toString(array));
}

测试结果:
在这里插入图片描述
时间复杂度:o(nlogn)
空间复杂度:o(logn)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 快速排序是一种高效的排序算法,它的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序的时间复杂度为O(nlogn),是一种比较快速的排序算法。 ### 回答2: 快速排序是一种基于分治法的高效的排序算法,被广泛应用于实际的排序问题中。其核心思想是选取一个枢轴元素将待排序序列分成两个子序列,一个子序列中的所有元素小于枢轴,另一个子序列中的所有元素大于枢轴,然后对这两个子序列分别进行递归排序,最终得到有序序列。 下面我们来分步讲解快速排序算法的实现过程: 1.选择枢轴 在实现快速排序算法时,一般采用三数取中法选取枢轴元素。即从待排序序列的第一个元素,中间元素和最后一个元素中选取中间值作为枢轴元素。 2.划分子序列 选取了枢轴元素后,接下来就需要根据枢轴元素将待排序序列划分成两个子序列。划分时需要从序列两端开始向中间扫描,将小于枢轴元素的元素放到左边的子序列中,大于枢轴元素的元素放到右边的子序列中。当左右两端的扫描相遇时结束扫描,最终得到两个子序列。 3.递归排序 接下来对划分后的两个子序列进行递归排序,重复上述过程,直到子序列中只包含一个元素为止。这时,所有子序列都已排序好,整个序列也就变成有序的了。 需要注意的是,在实现快速排序算法时,应该注意边界问题,尤其是递归过程中的边界条件的设置,否则可能会导致死循环或越界等错误。 快速排序算法的时间复杂度为O(nlogn),是一种十分高效的排序算法。其应用范围也非常广泛,几乎包括了所有需要排序的领域。在实际应用中,我们可以根据需要对快速排序算法进行一定的改进,以满足实际需求。例如,在排序大量数据时,我们可以采用并行化的方法,将待排序序列分成多个子序列并行地进行排序,以提高排序效率。 ### 回答3: 快速排序是一种基于比较的排序算法,它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再递归地对这两部分数据分别进行快速排序快速排序的时间复杂度为O(nlogn),是目前比较常用的排序算法之一。 快速排序的基本思想是选定一个基准元素,将数组中小于等于基准元素的元素放到其左边,大于基准元素的元素放到其右边,然后递归地对左、右子数组进行快速排序。具体实现时,我们通常选择待排序数组中的第一个元素作为基准元素,将数组从第二个元素开始扫描,把小于等于基准元素的放到左边,大于基准元素的放到右边,最后将基准元素插入到中间位置,这样排序之后基准元素就在它的最终位置上了。 快速排序的关键在于如何把小于等于基准元素的元素放到左边,大于基准元素的元素放到右边。这可以通过一趟扫描来实现,具体实现时可以采用双指针法,即设置一个指针i指向数组的第二个元素,一个指针j指向数组的最后一个元素,然后在数组中查找第一个小于等于基准元素的元素和第一个大于基准元素的元素,交换它们的位置,直到i>=j为止。这样扫描结束后,i所在的位置就是基准元素的位置。 快速排序的递归结束条件是子数组只包含一个元素或为空。这样,每次递归都会使待排序的数组规模减半,排序的复杂度就为O(nlogn)。 总结一下,快速排序是一种高效的排序算法,具有简单、快速、不需要额外的存储空间等优点,但是在最坏情况下的时间复杂度会达到O(n^2),因此需要注意基准元素的选择和算法的实现细节,以避免这种情况的出现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

威兹WizzCash

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值