這是我的博文系列《內部排序演算法》的第一篇。所謂排序,就是要整理檔案中的記錄,使之按關鍵字遞增(或遞減)次序排列起來。所謂內部排序,是指在排序過程中,若整個檔案都是放在記憶體中處理,排序時不涉及資料的內、外存交換(外排序的定義則相反)。
內部排序法按照策略可以劃分為五類:插入排序、選擇排序、交換排序、歸併排序和分配排序。待排檔案的儲存方式採用順序表(或直接用向量)作為儲存結構(其他的儲存結構還有以鍊錶作為儲存結構等)。
在這個系列的博文中,我按照排序演算法的給出,排序演算法的分析(包括演算法的時空複雜度分析)來展開。對於排序演算法的分析包括:對於演算法思路的分析,對於演算法時間複雜度的分析,對於演算法空間複雜度的分析,對於排序演算法穩定性的分析(待排序的檔案中,若存在多個關鍵字相同的記錄,經過排序後這些具有相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的)。
本文來介紹交換排序。交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。應用交換排序基本思想的主要排序方法有:氣泡排序和快速排序。
首先來介紹氣泡排序。給出排序演算法:
step1:初始化。初始化檔案記錄r,r[1..n]為無序區。
step2:掃瞄。從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(r[n],r[n-1]),(r[n-1],r[n-2]),…,(r[2],r[1]);對於每對氣泡(r[j+1],r[j]),若r[j+1].key
step3:判斷。判斷檔案是否有序,如果有序,則結束演算法,否則返回step2,繼續進行下一趟掃瞄。
冒泡演算法特徵:
下面給出**:
#include#include#includeusing namespace std;
#define maxsize 100
typedef int keytype;
void bubblesort(keytype r,int n)
r[i]=pivot;//基準記錄已被最後定位
return i;//基準元素位置
}int randompartition(keytype r,int i,int j){
//對r[low..high]做隨機劃分,並返回基準記錄的位置
//取位於low和high之間的隨機數k(low≤k≤high),用r[k]作為基準
srand((unsigned)time(null));
int k=i+rand()%(j-i+1);
swap(r[k],r[i]);
//下面的步驟與partition函式相同,不再作注釋
keytype pivot=r[i];
while(i=pivot)
j--;
if(i
面試 排序 一 交換排序
一 交換排序 兩兩比較待排序的關鍵字,並交換不滿足次序要求的那些偶對,直到全部滿足為止。常見的交換排序有氣泡排序和快速排序 1.氣泡排序 1 過程 比較相鄰元素,使關鍵字較小的元素交換至關鍵字較大的元素之上,使得經過一次氣泡排序後,關鍵字最小的元素到達最頂端,接著找到第二小的元素,依次類推。氣泡排序...
交換排序 氣泡排序
交換排序 兩兩比較待排序記錄的關鍵碼,若是逆序,則交換,直到無逆序。其中最簡單的交換排序是 氣泡排序。氣泡排序 bubble sort,也叫起泡排序 不斷地比較相鄰的記錄,若是不滿足排序要求,則交換。交換時,可從前向後,也可從後向前。看乙個從前向後的排序過程 原序列 12 3 45 33 6 下標 ...
氣泡排序 交換排序
最壞情況下,直接插入排序時間複雜度為 n 最小時間代價為 n 平均時間代價為 n 附加儲存空間 乙個儲存單位 穩定性 穩定 原址性 是 緊緻性 乙個比較,三個賦值操作 特點 對於基本有序,或偶爾有幾個在有序位置附近時,效率高,只有直接插入排序和它達到一樣的效果 整體效果不如直接插入排序,因為,直接插...