常见排序算法

来源:互联网 发布:防鼠公司知乎 编辑:程序博客网 时间:2024/06/03 03:11

1、冒泡排序

#include<stdio.h> void main(){ int i,j;int s[10]={10,2,34,24,15,89,100,1,50,90};for( i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序前for(i=0;i<10;i++){for(j=0;j<9;j++){if(s[i]<s[j]){ int temp = s[i]; s[i] = s[j]; s[j] = temp;}}}for(i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序后 }
2、直接插入排序
#include<stdio.h> void main(){ int i,j,temp;int s[10]={10,2,34,24,15,89,100,1,50,90};for( i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序前for(i=0;i<10;i++){temp = s[i]; //当前操作元素for(j=i-1;j>=-1&&s[j]>temp;j--){s[j+1] = s[j];s[j] = temp;}}for(i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序后 }
3、希尔排序
#include<stdio.h> void main(){ int i,j,temp,gap;int s[10]={10,2,34,24,15,89,100,1,50,90};for( i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序前for(gap=10/2;gap>0;gap/=2){   //gap表示步长,每次减半,直到减到1for(i=gap;i<10;i++){//定位到每一个元素    for(j=i-gap;(j>=0)&&(s[j]>s[j+gap]);j-=gap)//比较相距gap远的两个元素的大小,根据排序方向决定如何调换 {temp = s[j];s[j] = s[j+gap];v[j+gap] = temp;}}}for(i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序后 }

4、快速排序

/*先找到第一个数--10,把它作为中间值,也就是说,要把10放在一个位置,使得它左边的值比它小,右边的值比它大。这样一个数组的排序就变成了两个小数组的排序--10左边的数组和10右边的数组,而这两个数组继续用同样的方式继续下去,一直到顺序完全正确。*/#include<stdio.h>void quicksort(int a[],int left,int right){   int i,j,temp;   i=left;   j=right;   temp=a[left];   if(left>right)    return;   while(i!=j)   {      while(a[j]>=temp&&j>i)//发现左边有大于temp的数,则交换 j--;     if(j>i)          a[i++]=a[j];     while(a[i]<=temp&&j>i)//发现右边有小于temp的数,则交换      i++;     if(j>i)      a[j--]=a[i];      }   a[i]=temp;   quicksort(a,left,i-1);   quicksort(a,i+1,right);} void main(){ int i;int s[10]={10,2,34,24,15,89,100,1,50,90};for( i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序前quicksort(s,0,9);for(i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序后 }
5、选择排序

#include<stdio.h> void main(){ int i,j,min;int s[10]={10,2,34,24,15,89,100,1,50,90};for( i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序前for(i=0;i<10;i++){min=i;for(j=i+1;j<10;j++){  // 从j往前的数据都是排好的,所以从j开始往下找剩下的元素中最小的if(s[min]>s[j]){       //把剩下元素中最小的那个放到A[i]中 int temp = s[i];s[i] = s[j];s[j] = temp;}}}for(i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序后 }
6、二分插入排序

#include <stdio.h>void HalfInsertSort(int a[], int len){     int i, j,temp;     int low, high, mid;     for (i=1; i<len; i++)     {          temp = a[i];// 保存但前元素          low = 0;          high = i-1;          while (low <= high)    //在a[low...high]中折半查找有序插入的位置          {               mid = (low + high) / 2;    // 找到中间元素                if(a[mid] > temp){    // 如果中间元素比但前元素大,当前元素要插入到中间元素的左侧 high = mid-1;               }else{    // 如果中间元素比当前元素小,但前元素要插入到中间元素的右侧                low = mid+1;   }           }    // 找到当前元素的位置,在low和high之间           for (j=i-1; j>high; j--)// 元素后移             a[j+1] = a[j];          a[high+1] = temp;// 插入     }} void main(){ int i;int s[10]={10,2,34,24,15,89,100,1,50,90};for( i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序前HalfInsertSort(s,10);for(i=0;i<10;i++)printf("%d ",s[i]);printf("\n");//输出排序后 }



0 0
原创粉丝点击