# 原创 : 第八章 排序算法 # 第八章 排序算法 ``` #include <stdio.h> //1.插入排序 void InsetSort(int R[], int n) { int i,j,temp; for(i=1;i<n;++i) { //将待插关键字存入temp中 temp=R[i]; j=i-1; while(j>=0&&temp<R[j]) { R[j+1]=R[j]; --j; } //j+1相当于需要插入的关键字的位置 R[j+1]=temp; } } //2.折半插入排序 //返回有序关键字 int order(int R[], int n) { int i; for(i=0;i<n;++i) { if(R[i]>R[i+1])return i; } } void HarfSort(int R[], int n) { int i,j,m; int s,k,temp; int high; high = order(R,n); for(s=high+1;s<n;++s) { temp=R[s];//待插关键字 i=0;j=s-1;//需要将temp其中插入的序列 while(i<=j) { //有序中间关键字 m=(i+j)/2; //如果关键字的值小于中间值,则右边等于中间关键字 if(temp<R[m])j=m-1; else i=m+1; } //将元素右移,方便关键字插入 for(k=s-1;k>=m;--k)R[k+1]=R[k]; R[i]=temp; //不知道为什么是i } } //3.起泡排序 void BubbleSort(int R[], int n) { int i,j,flag,temp; for(i=n-1;i>=0;--i) { flag=0; for(j=1;j<=i;++j) { if(R[j-1]>R[j]) { temp=R[j-1]; R[j-1]=R[j] ; R[j]=temp; flag=1; } } if(flag==0)return; } } //4.起泡排序2 void BubbleSort2(int R[], int n) { int i,temp; int len = n; while(len>0) { for(i=0;i<n-1;++i) { if(R[i]>R[i+1]) { temp=R[i]; R[i]=R[i+1]; R[i+1]=temp; } } --len; } } //5.快速排序 void QuikSort(int R[], int low, int high) { int temp; int i=low, j=high; if(low<high) { temp=R[low]; while(i<j&&R[j]>=temp)--j; if(i<j) { R[i]=R[j]; ++i; } while(i<j&&R[i]<temp)++i; if(i<j) { R[j]=R[i]; --j; } R[i]=temp; QuikSort(R,low,i-1); QuikSort(R,i+1,high); } } //6.简单选择排序 //挑出最小的关键字 void SelectSort(int R[], int n) { int i,j,k,temp; for(i=0;i<n;++i) { k=i; for(j=i+1;j<n;++j) { if(R[k]>R[j]) k=j; } temp=R[i]; R[i]=R[k]; R[k]=temp; } } //7.堆排序 // 完成low到high上的low结点的调整 void Sift(int R[], int low, int high) { int i=low,j=2*i+1; int temp=R[i]; while(j<=high) { if(j<high&&R[j]<R[j+1]) ++j; if(temp<R[j]) { R[i]=R[j]; i=j; j=2*i+1; } else break; } R[i]=temp; } void HeapSort(int R[], int n) { int i; int temp; //建立初始堆 for(i<n/2;i>=0;--i) Sift(R,i,n); //出栈 for(i=n-1;i>=1;--i) { temp=R[0]; R[0]=R[i]; R[i]=temp; Sift(R,0,i-1); } } //8.测试 int main() { int i,len; int R[10]= {99,6,7,4,5,5,4,8,29,20}; len=sizeof(R)/sizeof(R[0]); //InsetSort(R, len); //HarfSort(R,len); //BubbleSort(R, len); //BubbleSort2(R,len); QuikSort(R,0,len-1); //SelectSort(R,len); //HeapSort(R,len); for(i=0;i<len;++i)printf("%d\n",R[i]); printf("Press enter to continue ..."); getchar(); return 0; } ```