常见的排序算法

  先写出来几个常见的排序算法:
  1插入排序
  2选择排序
  3冒泡排序
  4快速排序
  5归并排序
  6计数排序
 后续会更新堆排序,基数排序,希尔排序。。。。敬请期待。。

1
#include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 //插入排序 6 void swap(int *a,int *b) 7 { 8 int temp; 9 temp=*a; 10 *a=*b; 11 *b=temp; 12 } 13 void insertsort(int arry[],int len) 14 { 15 int temp=0; 16 int i=0,j=0; 17 for(i=1;i<len;i++) 18 { 19 temp=arry[i]; 20 j=i-1; 21 while(arry[j]>=temp&&j>=0) 22 { 23 arry[j+1]=arry[j]; 24 j--; 25 } 26 arry[j+1]=temp; 27 } 28 } 29 //选择排序 30 31 void slectsort(int arry[],int len) 32 { 33 int i=0,j=0; 34 int temp; 35 int min=0; 36 for(i=0;i<len;i++) 37 { 38 min=i; 39 for(j=i+1;j<len;j++) 40 { 41 if(arry[min]>arry[j]) 42 { 43 min=j; 44 } 45 } 46 if(min!=i) 47 { 48 temp=arry[i]; 49 arry[i]=arry[min]; 50 arry[min]=temp; 51 } 52 } 53 } 54 55 //冒泡排序 56 void bubblesort(int arry[],int len) 57 { 58 int i=0,j=0; 59 int flag=1; 60 for(i=0;i<len&&flag;i++) 61 { 62 flag=0; 63 for(j=len-1;j>i;j--) 64 { 65 if(arry[j]<arry[j-1]) 66 { 67 swap(&arry[j],&arry[j-1]); 68 flag=1; 69 } 70 } 71 } 72 } 73 74 //快速排序 75 int partion(int arry[],int begin,int end) 76 { 77 int i=0; 78 int loc=begin; 79 int mid=arry[begin]; 80 for(i=begin+1;i<=end;i++) 81 { 82 if(mid>=arry[i]) 83 { 84 loc++; 85 swap(&arry[loc],&arry[i]); 86 } 87 } 88 swap(&arry[loc],&arry[begin]); 89 return loc; 90 } 91 void quiksort(int arry[],int begin,int end) 92 { 93 int q; 94 if(begin<end) 95 { 96 q=partion(arry,begin,end); 97 quiksort(arry,begin,q-1); 98 quiksort(arry,q+1,end); 99 } 100 } 101 //归并排序 元素下标 102 void merge(int arry[],int begin,int mid,int end) 103 { 104 int a[1000]={0}; 105 int i=0,j=0,k=0; 106 for(i=begin,j=mid+1,k=0;i<=mid&&j<=end;k++) 107 { 108 if(arry[i]>arry[j]) 109 { 110 a[k]=arry[j]; 111 j++; 112 } 113 else 114 { 115 a[k]=arry[i]; 116 i++; 117 } 118 } 119 if(i>mid) 120 { 121 for(;j<=end;j++,k++) 122 { 123 a[k]=arry[j]; 124 } 125 } 126 if(j>end) 127 { 128 for(;i<=mid;i++,k++) 129 { 130 a[k]=arry[i]; 131 } 132 } 133 for(i=begin,k=0;i<=end;i++,k++) 134 { 135 arry[i]=a[k]; 136 } 137 } 138 void mergesort(int arry[],int begin,int end) 139 { 140 int mid=(begin+end)/2; 141 if(begin<end) 142 { 143 mergesort(arry,begin,mid); 144 mergesort(arry,mid+1,end); 145 merge(arry,begin,mid,end); 146 } 147 } 148 //计数排序 前提输入的数据都在0--k之间 149 void countsort(int arry[],int len,int k) 150 { 151 int count[1000]={0}; 152 int i=0; 153 int b[1000]={0}; 154 for(i=0;i<len;i++) 155 { 156 count[arry[i]]=count[arry[i]]+1; 157 } 158 for(i=1;i<k;i++) 159 { 160 count[i]=count[i]+count[i-1]; 161 } 162 for(i=len-1;i>=0;i--) 163 { 164 b[count[arry[i]]-1]=arry[i]; 165 count[arry[i]]--; 166 } 167 for(i=0;i<len;i++) 168 { 169 arry[i]=b[i]; 170 } 171 172 173 } 174 175 176 //测试 177 void print(int arry[]) 178 { 179 int i=0; 180 for(i=0;i<100;i++) 181 { 182 printf("%d ",arry[i]); 183 if((i+1)%10==0) 184 printf("\n"); 185 } 186 } 187 void main() 188 { 189 int i; 190 int a[100]={0}; 191 srand(time(NULL)); 192 for(i=0;i<100;i++) 193 { 194 a[i]=rand()%1001; 195 } 196 print(a); 197 // insertsort(a,100); 198 // slectsort(a,100); 199 // bubblesort(a,100); 200 // quiksort(a,0,99); 201 // mergesort(a,0,99); 202 countsort(a,100,1000); 203 printf("排序后的数组:\n"); 204 print(a); 205 }

 

posted @ 2013-05-30 22:01  zxjay  阅读(317)  评论(0编辑  收藏  举报