自己学的排序算法汇总

#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
int test[100] = {3,5,7,1,19,0,21,5,36,14};
int base[100] = {3,5,7,1,19,0,21,5,36,14};  // 比较用
int len = 10;
void print(int *a, int l){
 for(int i = 0; i < l; ++i)cout<<a[i]<<' ';
  cout<<endl;
}
//直接选择
void directInsertSort(int *a, int l){
 int count = 0;
 for(int i = 0; i < l; ++i){
  int tmp = a[i];
  for(int j = i-1; j>=0; --j){
   if(a[j]>tmp && ++count){
    swap(a[j+1],a[j]);
   }else{
    break;
   }
  }
 }
 cout<<count<<':';
 print(test,len);
}
//希尔排序
void shellSort(int *a, int l){
 int count = 0;
 for(int step = l/2; step>0; step /=2){
  for(int i = 0; i < l; ++i){
   int tmp = a[i];
   for(int j = i-step; j >= 0; j-=step){
    if(a[j]>tmp && ++count)
     swap(a[j+step],a[j]);
    else1
     break;
   }
  }
 }
 cout<<count<<':';
 print(test,len);
}
//堆排序
int cnt_for_heap = 0;
void percolateDown(int *a, int p, int l){
 int pointer = p;
 while(pointer<(l/2-1)){
  if(a[pointer]>a[(pointer+1)*2-1] && a[pointer]>a[(pointer+1)*2])break;
  else{
   ++cnt_for_heap;
   if(a[(pointer+1)*2-1]>a[(pointer+1)*2]){
    swap(a[pointer],a[(pointer+1)*2-1]);
    pointer = (pointer+1)*2-1;
   }else{
    swap(a[pointer],a[(pointer+1)*2]);
    pointer = (pointer+1)*2;
   }
  }
 }
 if((pointer+1)*2 ==l && a[(pointer+1)*2-1]>a[pointer]) swap(a[pointer],a[(pointer+1)*2-1]);
}
void buildHeap(int *a, int l){
 for(int i = l/2-1;i>=0;--i)
  percolateDown(a,i,l);
}
void heapSort(int *a, int l){
 cnt_for_heap = 0;
 buildHeap(a,l);
 for(int i = l-1; i >= 0; --i){
  swap(a[0],a[i]);++cnt_for_heap;
  percolateDown(a,0,i);
 }
 cout<<cnt_for_heap<<":";
 print(a,l);
}

//冒泡排序
void bubbleSort(int *a, int l){
 int count = 0;
 for(int i = l-1; i >= 0; --i){
  bool flag = 0;
  for(int j = i-1; j >=0; --j){
   if(a[j+1]<a[j]){
    ++count;
    swap(a[j],a[j+1]);
    flag = 1;
   }
  }
  if(!flag)break;
 }
 cout<<count<<':';
 print(a,l);
}
// 快速排序
int cnt_for_quick = 0;
int divide(int *a, int l, int h){
 int k = a[l];
 do{
  while(l<h && a[h] >= k)--h;
  if(l<h)a[l++] = a[h],
  ++cnt_for_quick;
  while(l<h && a[l] <= k)++l;
  if(l<h)a[h--] = a[l],
  ++cnt_for_quick;
 }while(l<h);
 a[l] = k;
 return l;
}
void quick(int *a, int l, int h){
 if(l>=h)return;
 int mid = divide(a,l,h);
 quick(a,l,mid-1);
 quick(a,mid+1,h);
}
void quickSort(int *a, int l){
 cnt_for_quick = 0;
 quick(a,0,l-1);
 cout<<cnt_for_quick<<':';
 print(a,l);
}
//归并排序
int cnt_for_merge = 0;
void merge(int *a, int l, int mid, int r){
 int i = l, j = mid, k = 0;
 int *tmp = new int[r-l+1];
 while(i<mid && j <= r){
  if(a[i]<a[j])tmp[k++]-+ = a[i++];
  else tmp[k++] = a[j++];
  ++cnt_for_merge;
 }
 while(i<mid)tmp[k++] = a[i++],++cnt_for_merge;
 while(j<=r)tmp[k++] = a[j++],++cnt_for_merge;
 for(i = l, k = 0; i <= r;)
  a[i++] = tmp[k++];
 delete [] tmp;
}
void mergeS(int *a, int l, int h){
 int mid = (l+h)/2;
 if(l==h)return ;
 mergeS(a,l,mid);
 mergeS(a,mid+1,h);
 merge(a,l,mid+1,h);
}
void mergeSort(int *a, int l){
 cnt_for_merge = 0;
 mergeS(a,0,l-1);
 cout<<cnt_for_merge<<':';
 print(a,l);
}



int main(){
 print(test,len);
 mergeSort(test,len);
 sort(base,base+len);
 print(base,len);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值