資料結構 c 排序演算法

2021-07-11 19:36:20 字數 3365 閱讀 6711

排序是將乙個記錄的任意序列,重新排列成乙個按關鍵字有序的序列(按非遞減或非遞增)。

排序演算法按排序過程中依據的不同原則可以大致分為五類:插入排序、交換排序、選擇排序、歸併排序、基數排序。

下面程式均使無序序列排序成非遞減序列。

資料結構使用順序表,並初始化8個元素 [49,38,65,97,76,13,27,49],

typedef struct  record;   

typedef struct sqlist;

基本操作是將乙個記錄插入到

已排好序的有序表中,得到乙個新的有序表。

1、直接插入排序。最簡單的排序方法。

演算法思想:從陣列第二個元素開始,將前面所有元素視為已排好序的有序表,在其中找到插入位置插入,重複過程直至結束。

void insertsort(sqlist &l)

l.r[j + 1] = l.r[0];

} }

}

2、折半插入排序。插入排序的操作可分為「查詢」和「插入」,折半插入即使用折半查詢來完成查詢,能有效減少關鍵字的比較次數,記錄移動次數不變。

void binsertsort(sqlist &l)else 

} //low 或 high+1 即為插入位置

for(int j = i - 1;j >= low;j --)

l.r[low] = l.r[0];

}}

3、希爾排序。演算法思想:設定乙個增量,將無序序列以這個增量為間隔分成若干個子串行,分別進行插入排序,縮小增量重複操作,直到整個序列中的記錄基本有序時,即增量縮小至1時,對全體記錄進行一次直接插入排序。時間效率大大提高。

void shellinsert(sqlist &l,int dk)

l.r[j + dk] = l.r[0];

} }

} void shellsort(sqlist &l,int dlta,int t)

} //如int a[3] = ;

//shellsort(l,a,3);

上述排序演算法執行結果:

基本操作是將兩個元素交換。比較簡單的是"氣泡排序",從頭比較相鄰的兩個記錄,將較大的移到後面,每一趟將剩餘序列最大的數移至末尾,大數像石頭一下沉到底,小數像泡泡慢慢冒起。。

快速排序:對氣泡排序的改進。演算法思想:設定乙個樞紐,通過一趟排序將序列分割成兩部分,一部分的關鍵字均比樞紐小,一部分均比樞紐大,再分別對兩部分記錄進行排序,達到整個序列有序。

int partition(sqlist &l,int low,int high) 

l.r[low] = l.r[high];

while(low < high && l.r[low].key <= pivokey)

l.r[high] = l.r[low];

} l.r[low] = l.r[0]; //low == high

return low;

}void qsort(sqlist &l,int low,int high)

}

執行結果:

選擇排序的基本思想是每一趟在n-i+1(i=1,2,...,n-1)個記錄中選擇關鍵字最小的記錄作為序列中第i個記錄。

1、簡單選擇排序:進行n-1趟選擇。

int selectminkey(sqlist l,int i)

} return min;

}void selectsort(sqlist &l)

}}

2、堆排序堆:n個元素的序列(k1,k2,...,kn)當且僅當滿足下面關係時,稱之為堆。

所有ki <= k2i, ki <= k(2i+1),    或     所有ki >= k2i, ki >= k(2i+1)        i=1,2,...,n/2。        將儲存堆的陣列看作完全二叉樹,則所有非終端結點都小於等於其左右孩子結點的值(或大於等於),該完全二叉樹的根(堆頂元素)必為序列中的最小值(或最大值)。

堆排序演算法思想: 由無序序列建立成堆,輸出堆頂元素(根結點),調整剩餘元素成為乙個新的堆,重複操作。

void heapadjust(sqlist &l,int s,int m)

if(rc.key >= l.r[j].key)

l.r[s] = l.r[j];

s = j;

} l.r[s] = rc;

}void heapsort(sqlist &l)

for(int i = l.length;i > 1;i --)

}

執行結果:

"歸併"含義是將兩個或多個

有序表組合成乙個新的

有序表。常用的有2-路歸併排序,將序列不斷分為兩半,直到得到長度為1的序列,開始兩兩歸併,直到結束,看出可用遞迴演算法。

void merge(sqlist l,sqlist &h,int i,int m,int n)else 

} for(;i <= m;i ++,k++)

for(;j <= n;j ++,k++)

}void msort(sqlist l,sqlist &h,int s,int t)

}void mergesort(sqlist &l)

執行結果:

借助多關鍵字排序,balabalabalabalabalabalabalabala

資料結構 快速排序演算法 C

1 從數列中取出乙個數作為基準數 樞軸,pivot 2 將陣列進行劃分 partition 將比基準數大的元素都移至樞軸右邊,將小於等於基準數的元素都移至樞軸左邊。3 再對左右的子區間重複第二步的劃分操作,直至每個子區間只有乙個元素。快排最重要的一步就是劃分了。劃分的過程用通俗的語言講就是 挖坑 和...

資料結構 排序演算法

include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...

資料結構 排序演算法

排序演算法分為內部排序和外部排序兩大類。內部排序 在計算機記憶體中完成的排序演算法 外部排序 不能再記憶體中文完成,必須在磁碟或者磁帶上完成的排序演算法 內部排序是研究的重點問題,通常我們講的八大排序演算法也主要是講的內部排序演算法。排序演算法的穩定性和時間空間複雜度 本文重點介紹以下幾種排序演算法...