#include <iostream> #include <ctime> using namespace std; void ArrayCopy(int a[],int b[],int n) { for(int i=0;i<n;i++) b[i] = a[i]; } void InsertSort(int a[],int b[],int n) { ArrayCopy(a,b,n); //还原原始的数据 int temp; for(int i=1;i<n;i++) { temp = a[i]; int j = i-1; while(j>=0 && a[j]>temp) { a[j+1] = a[j]; j--; } a[j+1] = temp; } cout<<"InsertSort:"<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } void InsertSortBin(int a[],int b[],int n) { ArrayCopy(a,b,n); int j,low,high,mid; int temp; for(int i=1;i<n;i++) { temp = a[i]; low = 0; high = i-1; while(low <= high) { mid = low + (high-low)/2; //取中间位置 if(temp < a[mid]) high = mid-1; //插入点在左半区 else low = mid+1; //插入点在右半区 } j = i-1; while(j >= high) { a[j+1] = a[j]; //记录后移 j--; } a[high+1] = temp; //插入 } cout<<"BinaryInsertSort:"<<endl; for(j=0;j<n;j++) cout<<a[j]<<" "; cout<<endl; } void ShellSort(int a[],int b[],int n) { ArrayCopy(a,b,n); int i,j; int temp; int d = n/2; //d取初值为n/2 while(d>0) { for(i=d;i<n;i++) //将R[d..n-1]分别插入各组当前有序区 { j = i-d; while(j>=0 && a[j]>a[j+d]) { temp = a[j]; a[j] = a[j+d]; a[j+d] = temp; j = j-d; } } d /= 2; //递减增量d } cout<<"ShellSort:"<<endl; for(i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } void BubbleSort(int a[],int b[],int n) { ArrayCopy(a,b,n); int temp; for(int i=0;i<n-1;i++) { for(int j=n-1;j>i;j--) { if(a[j]<a[j-1]) { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; } } } cout<<"BubbleSort:"<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } void BubbleSortAdv(int a[],int b[],int n) { ArrayCopy(a,b,n); int temp; int exchange; for(int i=0;i<n-1;i++) { exchange = 0; for(int j=n-1;j>i;j--) { if(a[j]<a[j-1]) { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; exchange = 1; } } //未发生交换,说明有序区已是全局有序了,则中途退出循环 if(exchange == 0) break; } cout<<"Advanced BubbleSort:"<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } void QuickSort(int a[],int s,int t) { int i = s,j = t; int temp; if(s<t) { temp = a[i]; while(i != j) { while(j>i && a[j]>=temp) j--; a[i] = a[j]; while(i<j && a[i]<=temp) i++; a[j] = a[i]; } a[i] = temp; QuickSort(a,s,i-1); QuickSort(a,i+1,t); } } void SelectSort(int a[],int b[],int n) { ArrayCopy(a,b,n); int temp,k; for(int i=0;i<n-1;i++) //做第i趟排序 { k = i; for(int j=i+1;j<n;j++) //在[i...n-1]中选key最小的R[k] { if(a[j] < a[k]) k = j; } if(k != i) { temp = a[i]; a[i] = a[k]; a[k] = temp; } } cout<<"Select Sort:"<<endl; for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } //堆排序 //建最大堆:复杂度是O(logn) void Sift(int a[],int low,int high) { int i = low; int j = 2*i; //左孩子 int temp = a[i]; while(j<=high) { //右孩子大,指向右孩子 if(j<high && a[j]<a[j+1]) j++; if(temp<a[j]) { a[i] = a[j]; //将a[j]调整到双亲节点的位置上 i = j; j = 2*i; } else break; } a[i] = temp; //被筛选节点的值放入最终位置 } void HeapSort(int a[],int b[],int n) { ArrayCopy(a,b,n); int i,temp; //循环建立初始化堆:这里的复杂度为O(n) for(i = n/2-1;i>=0;i--) Sift(a,i,n-1); //进行n-1次循环,完成堆排序 for(i=n-1;i>=1;i--) { //将第一个元素的值同当前区内的a[i]交换 temp = a[0]; a[0] = a[i]; a[i] = temp; //筛选a[0]节点(下标从0到i-1),得到一个i个节点的堆 Sift(a,0,i-1); } cout<<"Heap Sort:"<<endl; for(i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } void Merge(int a[],int c[],int left,int m,int right) { int i = left; int j = m+1; int k = left; while(i<=m && j<=right) { if(a[i] <= a[j]) c[k++] = a[i++]; else c[k++] = a[j++]; } while(i<=m) c[k++] = a[i++]; while(j<=right) c[k++] = a[j++]; } void MergeSort(int a[],int c[],int left,int right) { if(left < right) { int i = left+(right-left)/2; //取二路分割点 MergeSort(a,c,left,i); MergeSort(a,c,i+1,right); //将a中已经排好序的两半(以i为分割点)合并到数组b中 Merge(a,c,left,i,right); //将数组c中排好序的部分复制到原始数组a中(这里就说明了空间复杂度是O(n)) for(int i = left;i<=right;i++) a[i] = c[i]; } } int main() { int N; cout<<"Input Count:"; cin>>N; int *a = new int[N]; int *b = new int[N]; srand((unsigned)time(NULL)); for(int i=0;i<N;i++) { a[i] = rand(); cout<<a[i]<<" "; } cout<<endl; //插入排序 InsertSort(a,b,N); InsertSortBin(b,a,N); ShellSort(a,b,N); //交换排序 BubbleSort(b,a,N); BubbleSortAdv(a,b,N); ArrayCopy(b,a,N); QuickSort(a,0,N-1); cout<<"Quick Sort:"<<endl; for(int i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; //选择排序 SelectSort(a,b,N); HeapSort(b,a,N); //归并排序 int* c = new int[N]; ArrayCopy(a,b,N); MergeSort(a,c,0,N-1); cout<<"Merge Sort:"<<endl; for(int i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; delete []c; return 0; }