排序的三种方式(冒泡,插入,和选择)

来源:互联网 发布:淘宝卖家怎么找小二 编辑:程序博客网 时间:2024/06/06 08:58
一:冒泡排序:#include<stdio.h>#include<string.h>void bubble_sort(int *arr,int len){int i=0;    int j=0;int tmp=0;int flag=0;//设置标志位,从而来判断每次进入内层循环时是否有数据的交换,减少程序的运行int mark=len-1;//控制内部循环的次数int n=0;//保存内部循环数字交换的最后一位的下表for(i=0;i<len-1;i++){flag=1;for(j=0;j<mark;j++){if(arr[j]>arr[j+1]){tmp=arr[j];arr[j]=arr[j+1];arr[j+1]=tmp;flag=0;//如果内部发生交换,则flag设置为0                n=j;//保存最后一次交换的位置的下标}}if(flag)//如果一趟走完flag为1,说明内部没有发生交换。证明后面的数字已经有序,直接跳出{break;}mark=n;//将下标赋给mark,减少下次内部循环的次数,提高效率}}int main(){int  arr[]={1,9,6,8,7,3,2};    int  len=sizeof(arr)/sizeof(arr[0]);int  i=0;bubble_sort(arr,len);    for(i=0;i<len;i++){printf("%d ",arr[i]);}return 0;}二:选择排序:#include<stdio.h>#include<string.h>void Selection_sort(int *arr,int len){int i=0;int j=0;int min=0;//用于交换数字int k=0;//记录最小数字的下标if(len==1)//如果只有一个数字,不必排序,直接返回{return ;}for(i=0;i<len-1;i++)//从第一个数字开直到倒数第二个数字结束比较{k=i;//记录每次开始的下标for(j=i+1;j<len;j++)//从小一次下标开始,寻找最小值的下标{if(arr[j]<arr[k]){k=j;//用k记住}}if(k!=i)//如果k不是开始进入时的下标,则交换变量{min=arr[k];//把k下标之后的最小值和k下标的值做交换arr[k]=arr[i];arr[i]=min;}}}int main(){int  arr[]={1,9,6,8,7,3,2};    int  len=sizeof(arr)/sizeof(arr[0]);int  i=0;    Selection_sort(arr,len);    for(i=0;i<len;i++){printf("%d ",arr[i]);}return 0;}三:直接插入排序:#include<stdio.h>#include<string.h>void Direct_insertion_sort(int *arr,int len){int i=0;int j=0;int tmp=0;//记录每次排序完成后的最后一个数字的后一位,就是待排序的数字for(i=1;i<len;i++)//默认第一个数字已经排好序,从第二个数字开始{tmp=arr[i];//记录每次的待排序的数字j=i-1;//待排序数字的前一位数字的下标         while((arr[j]>tmp)&&(j>=0))//用while循环,将待排序的数字和前面以排好的数字进行一一的比较 { arr[j+1]=arr[j];//符合条件就向后移 j--; } arr[j+1]=tmp;//a[i]插入适当位置}}int main(){int  arr[]={1,9,6,8,7,3,2};    int  len=sizeof(arr)/sizeof(arr[0]);int  i=0;    Direct_insertion_sort(arr,len);    for(i=0;i<len;i++){printf("%d ",arr[i]);}return 0;}

0 0