#include <stdio.h> #include <stdlib.h> void swap(int k[],int lo,int hi) { int temp; temp=k[lo]; k[lo]=k[hi]; k[hi]=temp; } /* **冒泡排序 void BubbleSort1(int k[],int n) { int i,j,temp,count1=0,count2=0; for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { count1++; if(k[i]>k[j]) { count2++; temp=k[j]; k[j]=k[i]; k[i]=temp; } } } printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2); } void BubbleSort2(int k[],int n) { int i,j,temp,count1=0,count2=0; for(i=0;i<n-1;i++) { for(j=n-1;j>i;j--) { count1++; if(k[j-1]>k[j]) { count2++; temp=k[j-1]; k[j-1]=k[j]; k[j]=temp; } } } printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2); } */ void BubbleSort(int k[],int n) { int i,j,temp,count1=0,count2=0,flag; flag=1; for(i=0;i<n-1&&flag;i++) { for(j=n-1;j>i;j--) { count1++; flag=0; if(k[j-1]>k[j]) { count2++; temp=k[j-1]; k[j-1]=k[j]; k[j]=temp; flag=1; } } } printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2); } /* **选择排序 */ void SelectSort(int k[],int n) { int i,j,min,temp,count1=0,count2=0; for(i=0;i<n-1;i++) { min=i; for(j=i+1;j<n;j++) { count1++; if(k[j]<k[min]) { min=j; } } if(min!=i) { count2++; temp=k[min]; k[min]=k[i]; k[i]=temp; } } printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2); } /* **插入排序 */ void InsertSort(int k[],int n) { int i,j,temp; for(i=1;i<n;i++) { for(j=i;j>0;j--) { if(k[j]<k[j-1]) { temp=k[j]; k[j]=k[j-1]; k[j-1]=temp; } } } } /* **希尔排序 */ void ShellSort(int k[],int n) { int i,j,temp; int h=1; while(h<n/3) h=3*h+1; while(h>=1) { for(i=h;i<n;i++) { for(j=i;j>=h;j-=h) { if(k[j]<k[j-h]) { temp=k[j]; k[j]=k[j-h]; k[j-h]=temp; } } } h=h/3; } } /* **堆排序 */ void HeapAdjust(int k[],int s,int n) { int i,temp; temp=k[s]; for(i=2*s;i<=n;i*=2) { if(i<n&&k[i]<k[i+1]) { i++; } if(temp>=k[i]) { break; } k[s]=k[i]; s=i; } k[s]=temp; } void HeapSort(int k[],int n) { int i; for(i=n/2;i>0;i--) { HeapAdjust(k,i,n); } for(i=n;i>1;i--) { swap(k,1,i); HeapAdjust(k,1,i-1); } } /* **归并排序 */ #define MAXSIZE 10 void merge(int a[],int lo,int mid,int hi) { int i=lo,j=mid+1; int aux[MAXSIZE],k; for(k=lo;k<=hi;k++) { aux[k]=a[k]; } for(k=lo;k<=hi;k++) { if(i>mid) a[k]=aux[j++]; else if(j>hi) a[k]=aux[i++]; else if(aux[j]<aux[i]) a[k]=aux[j++]; else a[k]=aux[i++]; } } void MergeSort(int a[],int lo,int hi) { int mid=lo+(hi-lo)/2; if(lo<hi) { MergeSort(a,lo,mid); MergeSort(a,mid+1,hi); merge(a,lo,mid,hi); } } /* **归并排序迭代 void MergeSort_1(int k[],int n) { int i,left_min,left_max,right_min,right_max,next; int *temp=(int *)malloc(n*sizeof(int)); for(i=1;i<n;i*=2) { for(left_min=0;left_min<n-i;left_min=right_max) { right_min=left_max=left_min+i; right_max=left_max+i; if(right_max>n) { right_max=n; } next=0; while(left_min<left_max&&right_min<right_max) { if(k[left_min]<k[right_min]) { temp[next++]=k[left_min++]; } else { temp[next++]=k[right_min++]; } } while(left_min<left_max) { k[--right_min]=k[--left_min]; } while(next>0) { k[--right_min]=temp[--next]; } } } } */ /* ** 快速排序 */ #define MAX_LENGTH_INSERT_SORT 7 void ISort(int k[],int lo,int hi) { InsertSort(k+lo,hi-lo+1); } int partition(int k[],int lo,int hi) { int point; int mid=lo+(hi-lo)/2; if(k[lo]>k[hi]) { swap(k,lo,hi); } if(k[mid]>k[hi]) { swap(k,mid,hi); } if(k[mid]>k[lo]) { swap(k,mid,lo); } point=k[lo]; while(lo<hi) { while(lo<hi&&k[hi]>=point) { hi--; } k[lo]=k[hi]; while(lo<hi&&k[lo]<=point) { lo++; } k[hi]=k[lo]; } k[lo]=point; return lo; } void Qsort(int k[],int lo,int hi) { int point; if(hi-lo>MAX_LENGTH_INSERT_SORT) { while(lo<hi){ point=partition(k,lo,hi); if(point-lo<hi-point) { Qsort(k,lo,point-1); lo=point+1; } else { Qsort(k,point+1,hi); hi=point-1; } } } else { ISort(k,lo,hi); } } void QuickSort(int k[],int n) { Qsort(k,0,n-1); } /* **打印结果 */ void print(int a[]) { int i; printf("排序后的结果是:"); for(i=0;i<10;i++) { printf("%d ",a[i]); } printf("\n"); } void print_heap(int a[]) { int i; printf("排序后的结果是:"); for(i=1;i<10;i++) { printf("%d ",a[i]); } printf("\n"); } /* **打印排序选项 */ void printSortItems() { printf("please select items:\n"); puts("1.BubbleSort 2.QuickSort"); puts("3.SelectSort 4.HeapSort"); puts("5.InsertSort 6.ShellSort"); puts("7.MergeSort 8.Quit"); } int main() { int a[10]={5,2,6,0,3,9,1,7,4,8}; char c; /* **堆排序从1开始 */ int b[10]={-1,5,2,6,0,3,9,1,7,4}; printSortItems(); while((scanf("%c",&c))==1) { getchar(); switch(c) { case '1': BubbleSort(a,10); print(a); printSortItems(); break; case '2': QuickSort(a,10); print(a); printSortItems(); break; case '3': SelectSort(a,10); print(a); printSortItems(); break; case '4': HeapSort(b,9); print_heap(a); printSortItems(); break; case '5': InsertSort(a,10); print(a); printSortItems(); break; case '6': ShellSort(a,10); print(a); printSortItems(); break; case '7': MergeSort(a,0,9); print(a); printSortItems(); break; case '8': exit(0); default: fputs("input error!\n",stderr); printSortItems(); break; } } return 0; }