Sort

排序

副程式寫法

1.氣泡排序 Bubble Sort

#define SWAP(x,y,t)(t=x,x=y,y=t)

宣告:void bubble(int[],int);

呼叫:bubble(a,n);

1.1-雙層迴圈法:

void bubble(int a[],int n){

int i,j,temp;

for(i=0;i<n;i++){

for(j=i+1;j<n;j++){

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

SWAP(a[i],a[j],temp);

}

}

}

1.2-相鄰兩數比較法:

宣告:void one_bubble(int[],int);

呼叫:for(int i=0;i<n-1;i++){

one_bubble(arr,n-1-i);

}

void one_bubble(int a[],int end){

int j,temp;

for(j=0;j<end;j++){

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

SWAP(a[j],a[j+1],temp);

}

}

2.選擇排序 Select Sort

宣告:void select(int[],int);

呼叫:select(arr,n);

void select(int a[],int n){

int temp,key;

for (int i=0;i<n;i++){

key = i;

for(int j=i+1;j<n;j++){

if(a[j]<a[key])

key = j;

}

if(key!=i)

SWAP(a[i],a[key],temp);

}

}

3.插入排序 Insertion Sort

宣告:void Insert(int [],int);

呼叫:Insert(a,n);

void Insert(int a[],int n){

int tmp,j,k,l;

for(int i=1;i<n;i++){

tmp=a[i];

j=i-1;

while(a[j]>tmp && j>=0){

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

j--;

}

a[j+1]=tmp;

Print(a,n);

}

}

4.快速排序 Quick Sort,分治、遞迴。

宣告:int partition(int[],int,int);

void QuickSort(int[],int,int);

呼叫:QuickSort(a,0,n-1);

int partition(int a[],int left,int right){

int i,j,base,tmp;

base=a[right];

j=left-1;

for(i=left;i<right;i++){

if(a[i]<=base){

j++;

SWAP(a[i],a[j],tmp);

}

}

SWAP(a[j+1],a[right],tmp);

return j+1;

}

void QuickSort(int a[],int left,int right){

int p;

if(left<right){

p=partition(a,left,right);

QuickSort(a,left,p-1);

QuickSort(a,p+1,right);

}

}

5.合併排序 Merge Sort,分治、遞迴。