文章目录
1 选择排序。
思想: 每一次选择一个最大的数或者最小的数放在末尾。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void Selectsort(int a[],int n){ int i,j; for(i=n-1;i>=0;i--){ int Max=a[0],index=0; for(j=0;j<=i;j++){ if(a[j]>Max){ index=j; Max=a[j]; } } int temp=a[index]; a[index]=a[i]; a[i]=temp; } }
|
2 冒泡排序。
思想:如果相邻的两个数不是递增的,则交换。
1 2 3 4 5 6 7 8 9 10 11 12
| void Bunblesort(int a[],int n){ int i,j; for(i=n-1;i>=0;i--){ for(j=1;j<=i;j++){ if(a[j-1]>a[j]){ int temp=a[j-1]; a[j-1]=a[j]; a[j]=temp; } } } }
|
3 插入排序。
思想:对一个已经排好序的序列,插入一个新的数。
1 2 3 4 5 6 7 8 9 10 11
| void Insertsort(int a[],int n){ int i,j; for( i=1;i<n;i++){ int temp=a[i]; for(j=i-1;j>=0;j--){ if(a[j]<=temp)break; a[j+1]=a[j]; } a[j+1]=temp; } }
|
4 二路归并排序。
思想:把一个带排序的序列分成两段进行排序,直到这个序列是一个数,然后把已经排序好的两个序列进行合并。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| void Mergesort(int a[],int start,int end){ if(start==end)return; int mid=(start+end)/2; Mergesort(a,start,mid); Mergesort(a,mid+1,end); int temp[Maxn],i=start,j=mid+1,k=0,t; while(i<=mid&&j<=end){ if(a[i]<=a[j]) temp[k++]=a[i++]; else temp[k++]=a[j++]; } if(i>mid){ while(j<=end) temp[k++]=a[j++]; } else if(j>end){ while(i<=mid) temp[k++]=a[i++]; } for(t=0;t<k;t++){ a[t+start]=temp[t]; } }
|
5 快速排序。
思想:每一次选一个基准,把大于基准的数一道右边,小于基准的数移动到左边,最后的结果就是基准左边都是比它小的数,右边都是比它大的数。然后对于基准左边和右边重复以上操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void quicksort(int *a, int left, int right){ if(left >= right){ return ; } int i = left; int j = right; int key = a[left]; while(i < j){ while(i < j && key <= a[j]){ j--; } a[i] = a[j]; while(i < j && key >= a[i]){ i++; } a[j] = a[i]; } a[i] = key; quicksort(a, left, i - 1); quicksort(a, i + 1, right); }
|