几种常见的排序C实现
2018-07-20 来源:open-open
#include<stdio.h> #include<stdlib.h> //冒泡排序从小到大 第一趟得到最大的存到数组的最后,第二趟得到数组的第二大的,存到数组的倒数第二位。依次。。 void bubble_sort(int *p){ int length=6 ; for(int i=0;i<length;i++){ for(int j=0;j<length-i;j++){ if(p[j]>p[j+1]){ int t; t=p[j]; p[j]=p[j+1]; p[j+1]=t; } } } //打印输出 for(int i=0;i<length;i++){ printf("%d\n",p[i]); } } //希尔排序 void shell(int * p){ int length=6; //取增量 int step=length/2; while(step>=1){ //无序序列 for(int i=step;i<length;i++){ int temp=p[i]; int j; //有序序列 for(j=i-step;j>=0 && temp<p[j];j=j-step){ p[j+step]=p[j]; } p[j+step]=temp; } step=step/2; } } //选择排序(选择出最小的假定第一个为最小的 然后判断 是否交换) void selection_sort(int *p){ int length=6; int min,j,i,t; for(i=0; i<length;i++){ for(min=i,j=i+1;j<length;j++){ if(p[min]>p[j]){ min=j; } } if(min!=i){ t=p[i]; p[i]=p[min]; p[min]=t; } } //打印输出 for(int i=0;i<length;i++){ printf("%d\n",p[i]); } } //确定第一个数组元素的最终位置 int find_pos(int *a,int low,int high){ int val=a[low]; while(low<high){ while(low<high && a[high]>=val) --high; a[low]=a[high]; while(low<high && a[low]<=val) ++low; a[high]=val; } a[low]=val; return low; } //快速排序 递归调用 void quick_sort(int *a ,int low ,int high){ int pos; if(low<high){ pos=find_pos(a,low,high); quick_sort(a,low,pos-1); quick_sort(a,pos+1,high); } } //数组的两两合并操作,归并操作 void merge(int *p,int *temp,int left,int middle,int right){ //左指针尾 int leftend=middle-1; //右指针头 int rightstart=middle; //临时数组的下标 int tempindex=left; //数组合并后的长度 int templength=right-left+1; //先循环两个区间段都没有结束的情况 while((left<=leftend)&&(rightstart<=right)){ //r如果发现有序列小的,则将此数放入临时数组 if(p[left]<p[rightstart]){ temp[tempindex++]=p[left++]; }else{ temp[tempindex++]=p[rightstart++]; } } //判断左边序列是否结束 while(left<=leftend){ temp[tempindex++]=p[left++]; } //判断右边序列是否结束 while(rightstart<=right){ temp[tempindex++]=p[rightstart++]; } //交换数据 for(int i=0; i<templength;i++){ p[right]=temp[right]; right--; } } //归并排序 ---数组的划分 void merge_sort(int *p ,int *temp,int left,int right){ if(left<right){ //取分割位置 int middle=(left+middle)/2; //递归划分数组左序列 merge_sort(p,temp,left,middle); //递归划分数组右序列 merge_sort(p,temp,middle+1,right); //数组的合并操作 merge(p,temp,left,middle+1,right); } } //插入排序 void insert_sort(int *a){ int len=6; int i, j, temp; for(i = 1; i < len; i ++) { temp = a[i]; for(j = i - 1; j >= 0; j --) { if(a[j] > temp) { a[j + 1] = a[j]; }else { break; } } a[j + 1] = temp; } } int main(int argc, char* argv[]) { int a; int b[]={35,67,23,12,65,99}; //bubble_sort(b); //selection_sort(b); //quick_sort(b,0,5); shell(b); //insert_sort(b); for(int i=0;i<6;i++){ printf("%d\n",b[i]); } scanf("%a",&a); return 0; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。
最新资讯
热门推荐