自己学的排序算法汇总
来源:互联网 发布:淘宝网店如何装修店铺 编辑:程序博客网 时间:2024/06/18 15:43
#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
- 自己学的排序算法汇总
- 一些排序算法的汇总
- 常用的排序算法汇总
- 【排序】经典排序算法的汇总测试
- 排序算法--排序算法汇总
- 排序算法--排序算法汇总
- 学渣理解的选择排序算法
- 经典排序算法的汇总之基数排序
- 重新教自己学算法之非递归排序——冒泡-插入-排序(三)
- 重新教自己学算法之递归排序——快速排序(四)
- 重新教自己学算法之递归排序——合并排序(五)
- 重新教自己学算法之递归排序——堆排序(六)
- 菜鸟学排序算法
- 把自己学的选择排序整理了一下
- 排序算法汇总
- JAVA排序算法汇总
- java排序算法汇总
- 排序算法汇总
- 《微习惯》读后感
- struts2-请求参数校验
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
- 洛谷 P1262|P2341|P2002 强连通分量,缩点
- JavaWeb数据库开发知识总结(jdbc基础)
- 自己学的排序算法汇总
- POJ2976_Dropping tests_二分最大化平均值
- Linux上搭建tomcat
- JAVA 构造器+布局分析
- Flok_Fulkerson算法
- jQuery之Deferred对象的使用
- qmake使用
- 第一天
- 5-13 素数对猜想 (20分)