五種排序算法  若有數組a[N]

void exchange(int *l,int *r)

{

    int temp=*l;

    *l=*r;

    *r=temp;

}


 ①冒泡排序 雙層循環,兩兩比較

 for(i=0;i<N-1;i++)

    for(j=0;j<N-1;j++)

       if(a[j]>a[j+1])

          exchange(&a[j],&a[j+1]);

 ②選擇排序 雙層循環,從左至右依次找最小值

 for(i=0;i<N;i++)

 {

    min=i;

    for(j=i+1;j<N;j++)

       if(a[min]>a[j])

          min=j;

    exchange(&a[min],&a[i]);

 }

 ③插入排序 在已排好序的數列中,一個一個的插入新元素

 int temp;

 for(i=0;i<N;i++)

 {

    temp=a[i+1];

    for(j=i;temp<a[j]&&j>=0;j--)

       a[j+1]=a[j];

    a[j+1]=temp;

 }


 ④歸並排序 用遞歸將無序序列,不斷拆分至單個元素(此時各序列均為有序),再將拆分后的各個有序序列歸併

 void merge(int l,int m,int r)


{

    int i,j,k;

    for(i=l;i<=r;i++)

       b[i]=a[i];

    k=i=l;

    j=m+1;

    while(i<=m&&j<=r)

       if(b[i]<b[j])

//b[i]中存儲著a[i]的前半部份元素,而後半部份在b[j]中

          a[k++]=b[i++];

       else

          a[k++]=b[j++];

    while(i<=m)

       a[k++]=b[i++];

    while(j<=r)

       a[k++]=b[j++];


}


 void merge_sort(int l,int r)


 {

    if(l>=r)

       return;

    int m=(l+r)/2;

    merge_sort(0,m);

    merge_sort(m+1,r);

    merge(l,m,r);


}


 ⑤快速排序 每次遞歸都以某個點為界,將一串無序序列分為左右兩邊,左邊都比該點小,右邊都比該點大,直至將其分為單個元素

 int position(int l,int r)

 {

    int i,j;

    for(i=l+1,j=l;i<=r;i++)

       if(a[i]<a[l])

          exchange(&a[i],&a[++j]);

       exchange(&a[j],&a[l]);

    return j;


}


 void quick_sort(int l,int r)


{

    if(l>=r)

       return;

    int p=position(l,r);

    quick_sort(0,p-1);

    quick_sort(p+1,r);


 }