常见的排序算法(3)(《算法》读书笔记)

2 篇文章 0 订阅
1 篇文章 0 订阅

快速排序

快速排序算法核心思想

快速排序是通过每一次通过改变数组中元素的次序来确定一个位置的元素,然后经过迭代使所有的元素都处在正确的位置上

快速排序(简易版)
//主体部分,迭代进行快速排序
public static void sort(Comparable[] a,int lo,int hi) {
 if(hi<=lo)return;
 int mid=split(a,lo,hi);
 sort(a,lo,mid-1);
 sort(a,mid+1,hi);
 }
 
 //切分方法,来确认一个元素处在正确的位置上
 public static int split(Comparable[] a,int lo,int hi) {
 Comparable v=a[lo];
 int i=lo;
 int j=hi+1;
 /*
 *从数组两边扫描元素,保证左边扫描后的都是比第一个元素小,同理,右边的要比第一个元素大
 *如果遇到左边的比较大,而且此时右边扫描到一个元素比较小,则交换元素
 *最后交换第一个元素和j位置的元素
 */
 while(true) {
  while(AllSort.less(a[++i], v))if(i==hi)break;//从左到右扫描,有比v大的就继续下一步
  while(AllSort.less(v,a[--j]))if(j==lo)break;
  if(i>=j)break;
  //exch为交换元素位置的方法,可以看之前的博客
  AllSort.exch(a, i, j);
 }
 AllSort.exch(a, lo, j);
 return j;
}
三向切分快速排序

考虑到排序中会有重复的元素,为了避免不必要的比较,提高算法的性能,每次在不对重复的元素进行再排序

public static void sort(Comparable[] a,int lo,int hi) {
   int i=lo;
   int j=lo+1;
   int k=hi;
   if(hi<=lo)return;
   Comparable v=a[lo];
 while(j<=k) {
   int te=v.compareTo(a[j]);
   if(te>0)AllSort.exch(a, i++, j++);
   else if(te<0)AllSort.exch(a, j, k--);
   else j++;
 }
 sort(a,lo,i-1);
 sort(a,k+1,hi);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值