各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
2013-03-25 14:30
1136 查看
各种排序算法总结见http://blog.csdn.net/huahuahailang/article/details/8716434
一、基数排序
二、归并排序
三、插入排序
插入排序的另一种写法:
四、冒泡排序
五、选择排序
六、快速排序
七、希尔排序:
八、堆排序
//大根堆实现由小到大的排序
//小根堆实现由大到小的顺序排序
一、基数排序
#include<iostream> #include<time.h> using namespace std; #define N 13 //取13个数字 #define d 3 //3位数字 #define K 10 //10个筒子 void RadixSort(int num[]) { int i,j,k; int rate=1; int C ; int B ; for (i=0;i<d;i++) { for (j=0;j<K;j++) { C[j]=0; } for (j=0;j<N;j++) { k=num[j]/rate%10;//取出最后一位数字 C[k]++; } for (j=1;j<K;j++) { C[j] = C[j]+C[j-1]; } for (j=N-1;j>=0;j--) { k=num[j]/rate%10; B[C[k]-1]=num[j]; C[k]--; } cout<<"第 "<<i+1<<" 趟数据收集为:"<<endl; for (j=0;j<N;j++) { num[j]=B[j]; cout<<B[j]<<" "; } cout<<endl; rate *=10; } } int main(int argc,char *argv[]) { int i; int temp=1; int num ; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=0;i<N;i++) { num[i]=rand()%temp; } cout<<"排序之前数组中的数字为:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl; RadixSort(num); cout<<endl<<"使用基数排序之后:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
二、归并排序
#include<iostream> #include<time.h> using namespace std; #define N 13 //取13个数字 #define d 2 // 数字的最大位数 void merge(int num[],int p,int q,int r) { int n1,n2,i,j,k; int L ; int R ; n1=q-p+1; n2=r-q; for (i=0;i<n1;i++) { L[i]=num[p+i]; } for (j=0;j<n2;j++) { R[j]=num[q+1+j]; } k=p; i=0; j=0; while ((k<r)&&(i<n1)&&(j<n2)) { if (L[i]<=R[j]) { num[k]=L[i]; i++; } else { num[k]=R[j]; j++; } k++; } while (i<n1) { num[k++]=L[i++]; } while (j<n2) { num[k++]=R[j++]; } } void merge_sort(int num[],int p,int r) { int q; if (p<r) { q=(p+r)/2; merge_sort(num,p,q); merge_sort(num,q+1,r); merge(num,p,q,r); } } int main(int argc,char *argv[]) { int i; int temp=1; int num ; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=0;i<N;i++) { num[i]=rand()%temp; } cout<<"随机生成的排序之前数组中的数字为:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl;; merge_sort(num,0,N-1); cout<<endl<<"使用归并排序之后:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
三、插入排序
#include<iostream> #include<time.h> using namespace std; #define N 13 //取13个数字 #define d 2 // 数字的最大位数 void charu_sort(int num[]) { int i,j,k; int key; for (i=1;i<N;i++) { j=0; key=num[i]; while (j<=i) { if (num[j]>key) { k=i; while (k>j) { num[k]=num[k-1]; k--; } num[k]=key; break; } j++; } } } int main(int argc,char *argv[]) { int i; int temp=1; int num ; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=0;i<N;i++) { num[i]=rand()%temp; } cout<<"随机生成的排序之前数组中的数字为:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl;; charu_sort(num); cout<<endl<<"使用插入排序之后:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
插入排序的另一种写法:
#include<iostream> #include<time.h> using namespace std; #define N 13 //取13个数字 #define d 2 // 数字的最大位数 void charu_sort(int num[]) { int i,j; int key; for (i=1;i<N;i++) { key=num[i]; j=i-1; while (j>=0&&key<num[j]) { num[j+1]=num[j]; j--; } num[j+1]=key; } } int main(int argc,char *argv[]) { int i; int temp=1; int num ; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=0;i<N;i++) { num[i]=rand()%temp; } cout<<"随机生成的排序之前数组中的数字为:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl;; charu_sort(num); cout<<endl<<"使用插入排序之后:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
四、冒泡排序
#include<iostream> #include<time.h> using namespace std; #define N 13 //取13个数字 #define d 2 // 数字的最大位数 void buffer_sort(int num[]) { int i,j; int temp; for (i=0;i<N-1;i++) { for (j=0;j<N-1-i;j++) { if (num[j]>num[j+1]) { temp=num[j]; num[j]=num[j+1]; num[j+1]=temp; } } } } int main(int argc,char *argv[]) { int i; int temp=1; int num ; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=0;i<N;i++) { num[i]=rand()%temp; } cout<<"随机生成的排序之前数组中的数字为:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl;; buffer_sort(num); cout<<endl<<"使用冒泡排序之后:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
五、选择排序
#include<iostream> #include<time.h> using namespace std; #define N 13 //取13个数字 #define d 2 // 数字的最大位数 void choice_sort(int num[]) { int i,j,k; int temp; for (i=0;i<N-1;i++) { k=i; for (j=i+1;j<N;j++) { if (num[k]>num[j]) { k=j; } } if (k!=i) { temp=num[i]; num[i]=num[k]; num[k]=temp; } } } int main(int argc,char *argv[]) { int i; int temp=1; int num ; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=0;i<N;i++) { num[i]=rand()%temp; } cout<<"随机生成的排序之前数组中的数字为:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl;; choice_sort(num); cout<<endl<<"使用选择排序之后:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
六、快速排序
#include<iostream> #include<time.h> using namespace std; #define N 13 //取13个数字 #define d 2 // 数字的最大位数 int Partition(int num[],int p,int r) { int i,j; int X=num[p]; i=p; j=r; while (i<j) { while (i<j&&num[j]>X) { j--; } num[i]=num[j]; while (i<j&&num[i]<X) { i++; } num[j]=num[i]; } num[i]=X; return i; } void quick_sort(int num[],int p,int r) { int q; if (p<r) { q=Partition(num,p,r); quick_sort(num,p,q-1); quick_sort(num,q+1,r); } } int main(int argc,char *argv[]) { int i; int temp=1; int num ; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=0;i<N;i++) { num[i]=rand()%temp; } cout<<"随机生成的排序之前数组中的数字为:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl;; quick_sort(num,0,N-1); cout<<endl<<"使用快速排序之后:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
七、希尔排序:
#include<iostream> #include<time.h> #define N 13 //取13个数字 #define d 2 //3位数字 using namespace std; void ShellPass(int num[],int increment) { int i,j; int temp; for (i=increment;i<N;i++) { if (num[i]<num[i-increment]) { temp=num[i]; j=i-increment; do { num[j+increment]=num[j]; j=j-increment; } while (j>0&&temp<num[j]); num[j+increment]=temp; } } } void ShellSort(int num[]) { int increment=N;//增量 do { increment =increment/3+1; ShellPass(num,increment); } while (increment>1); } int main(int argc,char *argv[]) { int i; int temp=1; int num ; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=0;i<N;i++) { num[i]=rand()%temp; } cout<<"排序之前数组中的数字为:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl; ShellSort(num); cout<<endl<<"使用希尔排序之后:"<<endl; for (i=0;i<N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
八、堆排序
//大根堆实现由小到大的排序
#include<iostream> #include<time.h> #define N 8 //取13个数字 #define d 2 //3位数字 using namespace std; void MaxHeap(int num[],int i,int len) { int temp; int larger=i; int left=2*i; int right=2*i+1; if (left<=len&&num[left]>num[i]) { i=left; } if (right<=len&&num[right]>num[i]) { i=right; } if (i!=larger) { temp=num[larger]; num[larger]=num[i]; num[i]=temp; MaxHeap(num,i,len); } } void BuildMaxHeap(int num[],int len) { int i,j,temp; i=len/2; while (i>=1) { MaxHeap(num,i,len); i--; } } void HeapSort(int num[],int len) { int i; int temp; BuildMaxHeap(num,len); for (i=len;i>=2;i--)//将大根堆调整。将n--. { temp=num[i]; num[i]=num[1]; num[1]=temp; len --; MaxHeap(num,1,len); } } int main(int argc,char *argv[]) { int i; int temp=1; int num[N+1]; int len=N; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=1;i<=N;i++) { num[i]=rand()%temp; } cout<<"排序之前数组中的数字为:"<<endl; for (i=1;i<=N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl; HeapSort(num,len); cout<<endl<<"使用堆排序之后:"<<endl; for (i=1;i<=N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
//小根堆实现由大到小的顺序排序
#include<iostream> #include<time.h> #define N 13 //取13个数字 #define d 2 //3位数字 using namespace std; void MaxHeap(int num[],int i,int len) { int temp; int larger=i; int left=2*i; int right=2*i+1; if (left<=len&&num[left]<num[i]) { i=left; } if (right<=len&&num[right]<num[i]) { i=right; } if (i!=larger) { temp=num[larger]; num[larger]=num[i]; num[i]=temp; MaxHeap(num,i,len); } } void BuildMaxHeap(int num[],int len) { int i,j,temp; i=len/2; while (i>=1) { MaxHeap(num,i,len); i--; } } void HeapSort(int num[],int len) { int i; int temp; BuildMaxHeap(num,len); for (i=len;i>=2;i--)//将大根堆调整。将n--. { temp=num[i]; num[i]=num[1]; num[1]=temp; len --; MaxHeap(num,1,len); } } int main(int argc,char *argv[]) { int i; int temp=1; int num[N+1]; int len=N; srand((unsigned) time(NULL)); for (i=0;i<d;i++) { temp *= 10; } for (i=1;i<=N;i++) { num[i]=rand()%temp; } cout<<"排序之前数组中的数字为:"<<endl; for (i=1;i<=N;i++) { cout<<num[i]<<" "; } cout<<endl<<endl; HeapSort(num,len); cout<<endl<<"使用堆排序之后:"<<endl; for (i=1;i<=N;i++) { cout<<num[i]<<" "; } cout<<endl; return 0; }
相关文章推荐
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 牛客网Java刷题知识点之插入排序(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排序)、冒泡排序、快速排序、归并排序和基数排序(博主推荐)
- 排序方法了解一下(冒泡排序、选择排序、堆排序、插入排序、希尔排序、归并排序、快速排序、基数排序)
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
- 常用的排序算法(快速排序、插入排序、希尔排序、堆排序、冒泡排序、选择排序、归并排序)
- 几种常见的排序算法,选择排序,冒泡排序,希尔排序,堆排序,快速排序,归并排序,基数排序的比较
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- 常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序java实现
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现
- 数据结构与算法从零开始系列:冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序、基数排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版