對經典的排序方法:冒泡排序、直接插入排序、直接選擇排序、快速排序和歸併排序作一個總結。數組
//冒泡排序ui
//基本思想:一次冒泡:spa
從第一個數開始,與後一個數進行比較,若前一個數大於(遞增排序)後一個數,則交 換位置,直至數組的倒數第二個數,共進行n-1次比較,最大數排序完成。code
以此類推,直至最後一個數(最小數),比較一次便可完成。blog
#include <stdio.h> #include <malloc.h> //冒泡排序 void bubblesort(int a[],int n){ int i,j,temp; int swap; for(i=n-1;i>0;i--){ swap=0; for(j=0;j<i;j++){ if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; swap=1; } } if(swap==0){ break; } } } int main(){ int n,i; scanf("%d",&n); int* a; a=(int*)malloc(n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } bubblesort(a,n); for(i=0;i<n;i++){ printf(" %d",a[i]); } free(a); }
//直接插入排序排序
//基本思想:從第二個數開始,往前面的數組中插入數字。io
對以前的數組進行檢索,找到一個數它比要插入的數字大,且這個數字前一個數比要 插入的數字小的位置。從這個數字的位置到要插入數組的數字的位置前一位進行後 移,最後將要插入的數賦給這個位置。ast
#include <stdio.h> #include <malloc.h> //插入排序 void move(int a[],int first,int last){ int i; for(i=last-1;i>=first;i--){ a[i+1]=a[i]; } } void insertsort(int a[],int n){ int i,r,temp; for(i=2;i<n;i++){ for(r=0;r<i;r++){ if((r!=0&&a[r]>=a[i]&&a[r-1]<a[i])||(r==0&&a[i]<a[0])){ temp=a[i]; move(a,r,i); a[r]=temp; break; } } } } int main(){ int n,i; scanf("%d",&n); int* a; a=(int*)malloc(n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } insertsort(a,n); for(i=0;i<n;i++){ printf(" %d",a[i]); } free(a); }
//選擇排序class
//基本思想:在序列中挑出最小的與第一位數交換,再從第二位數開始的序列中再找出最小的與第 二位數交換,依此進行,直至只剩一個數。select
#include <stdio.h> #include <malloc.h> //選擇排序 void selectsort(int a[],int n){ int i,j; int min,k,temp; for(i=0;i<n-1;i++){ min=a[i]; k=i; for(j=i+1;j<n;j++){ if(a[j]<min){ min=a[j]; k=j; } } if(k!=i){ temp=a[i]; a[i]=a[k]; a[k]=temp; } } } int main(){ int n,i; scanf("%d",&n); int* a; a=(int*)malloc(n); for(i=0;i<n;i++){ scanf("%d",&a[i]); } selectsort(a,n); for(i=0;i<n;i++){ printf(" %d",a[i]); } free(a); }
// 快速排序
//基本思想:從第一個數開始,先從數組的末端開始找比它小的數,找到後,把這個數取出來(挖坑),再從數組的起始端開始找比它大的數,找到後,把這個數填到以前的坑裏,再從填的坑往前找比它小的數,填坑....直到兩端搜索碰到一塊,這個點,把它放入。這個肯定的點,將數組分紅兩塊,對每塊重複進行上述操做。
#include <stdio.h> #include <stdlib.h> //快速排序 void quicksort(int a[],int first,int last){ if(first<last){ int i=first,j=last; int key=a[i]; while(i<j){ while(i<j&&a[j]>=key){ j--; } if(i<j){ a[i++]=a[j]; } while(i<j&&a[i]<key){ i++; } if(i<j){ a[j--]=a[i]; } } a[j]=key; quicksort(a,first,j-1); quicksort(a,j+1,last); } } int main(){ int n; scanf("%d",&n); int* a; a=(int*)malloc(n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } quicksort(a,0,n-1); for(int r=0;r<n;r++){ printf("%d",a[r]); } free(a);
//歸併排序
//基本思想:分爲並和歸兩步。並就是定義第三個數組,把兩個排好的數組交替(判斷大小)往裏填,歸就是把一個數組對半拆拆到每一個數組只有一個數爲止。
#include <stdio.h> #include <stdlib.h> //歸併排序 void mergearray(int a[],int first,int mid,int last,int temp[]){ int i=first,j=mid+1; int m=mid,n=last; int k=0; while(i<=m&&j<=n){ if(a[i]<=a[j]){ temp[k++]=a[i++]; } else{ temp[k++]=a[j++]; } } while(i<=m){ temp[k++]=a[i++]; } while(j<=n){ temp[k++]=a[j++]; } for(i=0;i<k;i++){ a[first+i]=temp[i]; } } void mergesort(int a[],int first,int last,int temp[]){ if(first<last){ int mid=(first+last)/2; mergesort(a,first,mid,temp); mergesort(a,mid+1,last,temp); mergearray(a,first,mid,last,temp); } } int main(){ int n; scanf("%d",&n); int* a; a=(int*)malloc(n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } int* b; b=(int*)malloc(n); mergesort(a,0,n-1,b); for(int r=0;r<n;r++){ printf("%d",b[r]); } }