排序算法
冒泡排序
實(shí)現(xiàn)思路:
- 兩兩比較相鄰的關(guān)鍵碼,如果反序則交換格了,直到?jīng)]有反序的記錄
快速排序
實(shí)現(xiàn)思路:
- 快速排序算是對(duì)冒泡排序算法的改進(jìn),從記錄序列的兩端向中間進(jìn)行
兩者的區(qū)別
由于冒泡排序是對(duì)相鄰的數(shù)據(jù)進(jìn)行兩兩比較,元素的移動(dòng)次數(shù)和比較次數(shù)都比較多析藕,而快速排序是從記錄序列的兩端向中間進(jìn)行,所以在元素的移動(dòng)次數(shù)和比較次數(shù)上都減少了
冒泡排序使用兩層循環(huán)嵌套凳厢,具體代碼省略
具體實(shí)現(xiàn)快速排序算法:
public static void sortCore(int[] array,int startIndex,int endIndex) {
if(startIndex>=endIndex) {
return;
}
int boundary=boundary(array,startIndex,endIndex);//選擇劃分的Index值
//遞歸調(diào)用账胧,對(duì)數(shù)組兩部分排序
sortCore(array,startIndex,boundary-1);
sortCore(array,boundary+1,endIndex);
}
private static int boundary(int[] array, int startIndex, int endIndex) {
int standard=array[startIndex];//定義標(biāo)準(zhǔn),一般取首值先紫、中值或末值
int leftIndex=startIndex;//左指針
int rightIndex=endIndex;//右指針
while(leftIndex<rightIndex) {
while(leftIndex<rightIndex&&array[rightIndex]>=standard) {
rightIndex--;//找出右半部分小于標(biāo)準(zhǔn)的Index值
}
array[leftIndex]=array[rightIndex];//把小于的值賦值到左半部分
while(leftIndex<rightIndex&&array[leftIndex]<=standard) {
leftIndex++;//找出左半部分大于標(biāo)準(zhǔn)的Index值
}
array[rightIndex]=array[leftIndex];//賦值到右邊
}
array[leftIndex]=standard;//標(biāo)準(zhǔn)值賦給左邊
return leftIndex;//返回新的劃分Index值
}
選擇排序
- 每趟排序在當(dāng)前待排序序列中選出關(guān)鍵碼最小的記錄治泥,添加到有序序列中
- 特點(diǎn)是記錄的移動(dòng)次數(shù)少
inti,j;
for(i=0;i<r.length-1;i++){//對(duì)n個(gè)記錄進(jìn)行n-1趟的選擇排序
index=i;//初始化第i趟選擇排序的最小記錄的指針
for(j=i+1;j<r.length;j++){//在無(wú)序區(qū)選取最小記錄
if(r[j]<r[index]){
index=j;
}
}
if(index!=i){//將最小記錄與r[i]交換
temp=r[i];
r[i]=r[index];
r[index]=temp;
}
}
幾種排序算法的比較和選擇
- 選取排序方法需要考慮的因素:待排序元素?cái)?shù)量n、元素分布情況遮精、元素信息量大小居夹、使用的語(yǔ)言工具
小結(jié)
- 若n較小(n <= 50),則可以采用直接插入排序或直接選擇排序本冲。由于直接插入排序所需的記錄移動(dòng)操作較直接選擇排序多准脂,因而當(dāng)記錄本身信息量較大時(shí),用直接選擇排序較好檬洞。
- 若文件的初始狀態(tài)已按關(guān)鍵字基本有序意狠,則選用直接插入或冒泡排序?yàn)橐恕?/li>
- 若n較大,則應(yīng)采用時(shí)間復(fù)雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸并排序疮胖』犯辏快速排序是目前基于比較的內(nèi)部排序法中被認(rèn)為是最好的方法闷板。
- 在基于比較排序方法中,每次比較兩個(gè)關(guān)鍵字的大小之后院塞,僅僅出現(xiàn)兩種可能的轉(zhuǎn)移遮晚,因此可以用一棵二叉樹(shù)來(lái)描述比較判定過(guò)程,由此可以證明:當(dāng)文件的n個(gè)關(guān)鍵字隨機(jī)分布時(shí)拦止,任何借助于"比較"的排序算法县遣,至少需要O(nlog2n)的時(shí)間。
- 當(dāng)記錄本身信息量較大時(shí)汹族,為避免耗費(fèi)大量時(shí)間移動(dòng)記錄萧求,可以用鏈表作為存儲(chǔ)結(jié)構(gòu)。