C语言排序源码
- 格式:pdf
- 大小:71.68 KB
- 文档页数:2
#include <stdio.h>//直接插入排序#define MAX 80void InsertSort(int R[],int n) { /*对数组R中的记录R[1..n]按递增序进行插入排序*/ int i,j;for(i=2;i<=n;i++) /*依次插入R[2],…,R[n]*/if(R[i]<R[i-1]){ /*若R[i]大于等于有序区中所有的R,则R[i]应在原有位置上*/ R[0]=R[i]; /*R[0]是哨兵,且是R[i]的副本*/j=i-1;do{ /*从右向左在有序区R[1..i-1]中查找R[i]的插入位置*/R[j+1]=R[j]; /*将关键字大于R[i]的记录后移*/j--;}while(R[0]<R[j]); /*当R[i]≥R[j]时终止*/R[j+1]=R[0]; /*R[i]插入到正确的位置上*/}}void main() {int i,n;int R[MAX];clrscr();printf("input number of data: ");scanf("%d",&n);if(n<=0||n>MAX){printf("the number must more than 0 and less than %d.\n",MAX);exit(0);}printf("Please input the data:");for(i=1;i<=n;i++) /*往数组中输入数据*/scanf("%d",&R[i]);puts("before sorting:");for(i=1;i<=n;i++)printf("%4d",R[i]);printf("\n");InsertSort(R,n); /*调用插入排序进行排序*/puts("\n after sorting:");for(i=1;i<=n;i++) /*输出数组元素*/printf("%4d",R[i]);}#include <stdio.h>//折半插入排序#define MAX 80void InsertSortB(int R[],int n){ /*对数组R中的记录R[1..n]按递增序进折半插入排序*/ int i,j,low,high,mid;for(i=2;i<=n;i++) {R[0]=R[i]; /*保存待插入的元素*/low=1;high=i-1; /*设置初始区间*/while(low<high) { /*二分法寻找插入位置*/mid=(low+high)/2;if(R[0]>R[mid]) /*插入位置在高半区*/low=mid+1;elsehigh=mid-1; /*插入位置在低半区*/}for(j=i-1;j>=high;j--)R[j+1]=R[j]; /*后移元素,留出插入空位*/R[high]=R[0]; /*插入元素*/}}void main() {int i,n;int R[MAX];clrscr();printf("input number of data: ");scanf("%d",&n);if(n<=0||n>MAX){printf("the number must more than 0 and less than %d.\n",MAX);exit(0);}printf("Please input the data:");for(i=1;i<=n;i++) /*往数组中输入数据*/scanf("%d",&R[i]);puts("before sorting:");for(i=1;i<=n;i++)printf("%4d",R[i]);printf("\n");InsertSortB(R,n); /*调用插入排序进行排序*/puts("\n after sorting:");for(i=1;i<=n;i++) /*输出数组元素*/printf("%4d",R[i]);}#include "stdio.h"//希尔排序#define MAX 80void InsertSortC(int R[],int n) { /*对数组R中的记录R[1..n]按递增序进行希尔排序*/ int i,j,jump;jump=n/2; /*给出对n个数据的分组*/while(jump>=1) { /*如果分组数大于1*/for (i=jump;i<=n;i ++){ /*对此组数据进行插入排序*/j=i-jump; /*插入排序的while(j>=1) /*比较数据的下标大于等于1*/if (R[j]>R[j+jump]){ /*如果第j个数据大于同组后面的数据,交换*/R[0]=R[j+jump];R[j+jump]=R[j];R[j]=R[0];j=j-jump; /*比较同组的其他数据*/}elsej =-1; /*比较另外组的数据*/}jump/=2; /*减少分组数*/}}void main() {int i,n;int R[MAX];clrscr();printf("input number of data: ");scanf("%d",&n);if(n<=0||n>MAX){printf("the number must more than 0 and less than %d.\n",MAX);exit(0);}printf("Please input the data:");for(i=1;i<=n;i++) /*往数组中输入数据*/ scanf("%d",&R[i]);puts("before sorting:");for(i=1;i<=n;i++)printf("%4d",R[i]);printf("\n");InsertSortC(R,n); /*调用插入排序进行排序*/puts("\n after sorting:");for(i=1;i<=n;i++) /*输出数组元素*/printf("%4d",R[i]);}#define MAX 80//快速交换排序int partion(int R[],int low,int high) { /*对记录R[low..high]进行一趟快速排序*/R[0]=R[low]; /*将枢轴记录移至数组的闲置分量*/while (low <high) { /*从表的两端交替地向中间扫描*/while (low<high && R[high]>R[0]) high--;if (low<high) { /*将比枢轴记录小的记录移到低端*/R[low]=R[high];low++;}while (low<high && R[low]<R[0]) low++;if (low<high) { /*将比枢轴记录大的记录移到高端*/R[high]=R[low];high--;}}R[low]=R[0]; /*枢轴记录移到正确位置*/return low; /*返回枢轴位置*/}void SwapSortB(int R[],int s,int t) { /*对数组R中的记录R[s..t]按递增序进行快速排序*/int i;if (s<t) {i=partion(R,s,t);SwapSortB(R,s,i-1);SwapSortB(R,i+1,t);}}void main() {int i,n;int R[MAX];clrscr();printf("input number of data: ");scanf("%d",&n);if(n<=0||n>MAX){printf("the number must more than 0 and less than %d.\n",MAX);exit(0);}printf("Please input the data:");for(i=1;i<=n;i++) /*往数组中输入数据*/scanf("%d",&R[i]);puts("before sorting:");for(i=1;i<=n;i++)printf("%4d",R[i]);printf("\n");SwapSortB(R,1,n); /*调用插入排序进行排序*/puts("\n after sorting:");for(i=1;i<=n;i++) /*输出数组元素*/printf("%4d",R[i]);}#define MAX 80//堆排序void Heapify( int R[],int s,int m){ /*对R[s..m]进行堆调整,用temp做暂存单元*/ int j,temp;temp=R[s];j=2*s;while (j<=m){ /*按照数据值较大的结点向下筛选*/if (R[j]>R[j+1]&&j<m)j++; /*j指向关键字码较大的孩子*/if (temp<R[j]) /*不同调整到叶子结点*/break;R[s]=R[j]; /*继续往下调整*/s=j;j=j*2;} /* end of while */R[s]=temp; /*插入数据*/}void BuildHeap(int R[],int n){ /*由一个无序的序列建成一个堆*/int i;for(i=n/2;i>0;i--)Heapify(R,i,n);}void HeapSort(int R [],int n){ /*对R[1..n]进行递减的堆排序,不妨用R[0]做暂存单元*/ int i;BuildHeap(R,n); /* 将R[1-n]建成初始堆*/for(i=n;i>1;i--){/*对当前无序区R[1..i]进行堆排序,共做n-1趟*/ R[0]=R[1];R[1]=R[i];R[i]=R[0]; /*将堆顶和堆中最后一个记录交换*/Heapify(R,1,i-1); /*将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质*/ }}void main() {int i,n;int R[MAX];clrscr();printf("input number of data: ");scanf("%d",&n);if(n<=0||n>MAX){printf("the number must more than 0 and less than %d.\n",MAX);exit(0);}printf("Please input the data:");for(i=1;i<=n;i++) /*往数组中输入数据*/scanf("%d",&R[i]);puts("before sorting:");for(i=1;i<=n;i++)printf("%4d",R[i]);printf("\n");HeapSort(R,n); /*调用插入排序进行排序*/puts("\n after sorting:");for(i=1;i<=n;i++) /*输出数组元素*/printf("%4d",R[i]);}#define MAX 80//二路归并排序void Merge(int R[],int low,int m,int high){ /*将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high] */int i=low,j=m+1,p=0; /*置初始值*/int *R1; /*R1是局部向量,若p定义为此类型指针速度更快*/ R1=(int *)malloc((high-low+1)*sizeof(int));if(!R1){ /*申请空间失败*/puts("fail!");return;}while(i<=m&&j<=high) /*两子文件非空时取其小者输出到R1[p]上*/R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];while(i<=m) /*若第1个子文件非空,则复制剩余记录到R1中*/ R1[p++]=R[i++];while(j<=high) /*若第2个子文件非空,则复制剩余记录到R1中*/ R1[p++]=R[j++];for(p=0,i=low;i<=high;p++,i++)R[i]=R1[p]; /*归并完成后将结果复制回R[low..high]*/}void MergeSort(int R[],int low,int high){ /*用分治法对R[low..high]进行二路归并排序*/int mid;if(low<high) { /*区间长度大于 1 */mid=(low+high)/2; /*分解*/MergeSort (R,low,mid); /*递归地对R[low..mid]排序*/MergeSort (R,mid+1,high); /*递归地对R[mid+1..high]排序*/Merge(R,low,mid,high); /*组合,将两个有序区归并为一个有序区*/}}void main() {int i,n;int R[MAX];clrscr();printf("input number of data: ");scanf("%d",&n);if(n<=0||n>MAX){printf("the number must more than 0 and less than %d.\n",MAX);exit(0);}printf("Please input the data:");for(i=1;i<=n;i++) /*往数组中输入数据*/ scanf("%d",&R[i]);puts("before sorting:");for(i=1;i<=n;i++)printf("%4d",R[i]);printf("\n");MergeSort(R,1,n); /*调用插入排序进行排序*/puts("\n after sorting:");for(i=1;i<=n;i++) /*输出数组元素*/printf("%4d",R[i]);}。