基础排序算法总结

排序算法总结:(算法4笔记)
1、选择排序
两层for循环,每次选出最小的放在最前面的位置
实现:
public void sort_Choose(int[] a)
{
int N = a.length;
for(int i=0;i<N;i++)
{
//定义min为哨兵
int min = i;
for(int j=i+1;j<N;j++)
{
if(a[min] > a[j]) min = j;
}
exch(a,i,min);
}
}
2、插入排序
for(int i=1;i<a.length;i++){
//当前所指的值小于前面的值时,往前插入
for(int j=i;j>0 && less(j,j-1);j--){
//if(less(j,j-1))将if判断放在for中提高了效率
//只有同时满足两个条件才换且当出现一个不满足条件时前面的就都不满足
exch(j,j-1);
}
}
3、希尔排序:插入排序的优化
通过分段有序后再插入使得排序更快
int N = a.length;
while(h < N/3) h = 3*h+1;
while(h >= 1){
for(int i=h;i<N;i++){
for(int j=i;j>0 && less(j,j-h);j-=h){
exch(j,j-h);
}
}
h = h/3;
}
4、归并排序
分为两个部分merge和sort
merge(int[] a,int lo,int mid;int hi)
i=lo;
j=hi+1;
//转存数组a需要排序部分到aux[]数组内,在排序到a[]中

for(int k=lo;k<=hi;k++){//一次循环排序一个数
if(i>mid) a[k] = aux[j++];
else if(j>hi) a[k] = aux[i++];
else if(less(aux[i],aux[j])) a[k] = aux[i++];
else a[k] = aux[j++];
}
sort部分
sort(int a[],int lo,int hi)
if(hi <= lo) return;
int mid = lo + (hi-lo)/2;
//递归调用
sort(a,lo,mid);//排序左边
sort(a,mid+1,hi);//右边
merge(a,lo,mid,hi);
5、快速排序
两部分partition 和 sort
partition(int[] a,int lo,int hi){
int i = lo;
int j = hi+1;
int v = a[lo];
while(i >= 0){
while(less(a[++i],v)) if(i == hi) break;
while(less(v,a[--j])) if(j == lo) break;
if(i >= j) break;
exch(i,j);
}
exch(lo,j);
return j;
}


sort(int[] a,int lo,int hi){
if(hi <= lo) return;
//先切分,递归之前排列完成一次
int j = partition(a,lo,hi);
//递归调用切分到最小粒度返回!
sort(a,lo,j-1);
sort(a,j+1,hi);
}
6、优先队列(数组实现的完全二叉树)
三部分:sink(),swim(),delMax(),insert();
sink(int k){
while(2*k <= N){
int j = 2*k;
if(less(j,j+1)) j++;
if(less(j,k)) break;
exch(j,k)
k = j;
}
}


swim(int k){
while(k > 1 && less(k/2,k)){
exch(k/2,k);
k = k/2;
}
}


Key delMax(){
int max = pq[1];
exch(1,N--);
pq[N+1] = null;//这里不要改变N的值
sink(1);
return max;
}


void insert(Key v){
pq[++N] = v;
swim(N);
}
优先队列依次调用delMax可以排序


7、堆排序
sort(int[] a){
int k = a.lenth/2;
//堆有序
for(;k>=1;k--){
sink(k);
}
// 排序;数组有序
while(N > 1){
exch(1,N--);
sink(1);
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值