各种排序的原理
1.選擇排序:
? 首先通過(guò)n-1次關(guān)鍵字比較,從n個(gè)記錄中找出關(guān)鍵字最小的記錄,將它與第一個(gè)記錄交換;
? 再通過(guò)n-2次比較,從剩余的n-1個(gè)記錄中找出關(guān)鍵字次小的記錄,將它與第二個(gè)記錄交換;
? 重復(fù)上述操作,共進(jìn)行n-1趟排序后,排序結(jié)束。
void Selesort(int *Array,int n) {int i,j,k,tmp;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(Array[j]<Array[k]) k=j;if(i!=k){tmp=Array[i];Array[i]=Array[k];Array[k]=tmp;}} }
2.快速排序:
快速排序是對(duì)冒泡排序的一種改進(jìn),其原理是分治法。
設(shè)要排的數(shù)組是a[0],a[1],...a[n-1],首先任選取一個(gè)數(shù)據(jù),通常選取第一個(gè)數(shù)據(jù)作為關(guān)鍵數(shù)據(jù),然后將所有比它小的
數(shù)都放到它前面,所有比它大的數(shù)都放到它后面,這個(gè)過(guò)程稱為一趟快速排序。
一趟快速排序的算法是:
(1)設(shè)置兩個(gè)變量i,j,排序開始的時(shí)候:i=0,j=n-1
(2)以第一個(gè)數(shù)據(jù)作為關(guān)鍵數(shù)據(jù)賦值給key,即key=a[0]
(3)從j開始向前搜索,即由后開始向前搜索(j=j-1),找到第一個(gè)小于key的值a[j],并與a[i]交換
(4)從i開始向后搜索,即由前向后搜索(i=i+1),找到第一個(gè)大于key的值a[i],與a[j]交換
(5)重復(fù)(3)(4)(5)步,直到i=j;
void QuickSort(int *Array,int x,int y) {int key=Array[x];int i=x,j=y;if(i>=j) return;while(i<j){while(i<j&&a[j]>=key) j--;Array[i]=Array[j];while(i<j&&Array[i]<=key) i++;Array[j]=Array[i];}Array[j]=key;QuickSort(Array,x,j-1);QuickSort(Array,j+1,y); } 3.歸并排序:歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子
序列是有序的。然后再把有序子序列合并為整體有序序列。歸并操作的工作原理如下:
第一步:申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來(lái)存放合并后的序列
第二步:設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置
第三步:比較兩個(gè)指針?biāo)赶虻脑?#xff0c;選擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置
重復(fù)步驟3直到某一指針達(dá)到序列尾,將另一序列剩下的所有元素直接復(fù)制到合并序列尾
// 原數(shù)組Array,臨時(shí)空間數(shù)組tmp void merge(int low,int mid,int high) {int i=low,j=mid+1,k=low;while(i<=mid&&j<=high){//此處為排序順序的關(guān)鍵,用小于表示從小到大排序if(Array[i]<=Array[j]) tmp[k++]=Array[i++];else tmp[k++]=Array[j++];}while(i<=mid) tmp[k++]=Array[i++];while(j<=high) tmp[k++]=Array[j++];for(i=low;i<=high;i++) //寫回原數(shù)組Array[i]=tmp[i]; }/**全部排序的調(diào)用為mergeSort(0,4) */ void mergeSort(int a,int b) {if(a<b){int mid=(a+b)/2;mergeSort(a,mid);mergeSort(mid+1,b);merge(a,mid,b);} }總結(jié)
- 上一篇: HDU4611(找循环节)
- 下一篇: x^A=B(mod C)的解 (离散对数