数据结构-第九章 内部排序-知识点总结2
生活随笔
收集整理的這篇文章主要介紹了
数据结构-第九章 内部排序-知识点总结2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
選擇類排序:
1.簡單選擇排序:
直接從數組中選擇最小的記錄和第一個記錄交換位置,循環.
示例代碼如下:
void SelectSort(int r[], int b){int i, j, k;int x;for(i = 1; i < n; i++){k = i;for(j = i+1; j <= n; j++){if(r[j] < r[k])//選擇最小的記錄,得到在數組中的位置 k = j;}if(k != i){x = r[i];r[i] = r[k];r[k] = x;}//交換位置 } }時間復雜度:O(n^2).
2.樹形選擇排序(錦標賽排序):
與簡單選擇排序不同點是,占用空間更多,保留了之前的比較結果
每一個記錄看作葉子節點,兩兩比較,選出最小的為雙親,進一步遞歸向上,找出根,比較成功后,該記錄對應的葉子節點置為無窮;
進一步兩兩比較重復上述過程,直到記錄全部輸出
時間復雜度:O(nlog2(n)).?
3.堆排序:
排序過程中把向量中儲存的數據看作一顆完全二叉樹來進行操作
重建堆:
?? ?大堆,篩選最大的元素出去,然后最后的元素補根節點,調整堆使最大的元素在最上面?
算法如下:
void sift(Type r[], int k, int m){//r[k...m]是以r[k]為根的完全二叉樹,調整r[k]使之滿足堆的性質 int i, j, t, x;t = r[k];x = r[k].key; i = k;j = 2 * k;//j指向t的左孩子bool finished = false;while(j <= m && !finished){if(j + 1 <= m && r[j].key < r[j+1].key){j++;}//得到左右孩子中記錄關鍵字較大的位置坐標 if(x >= r[j].key) //如果滿足堆的性質,上面的比孩子大 finished = true;else{r[i] = r[j];i = j;j = 2 * i;}} r[i] = t; } 建初堆: void crt_heap(Type r[], int n) {//對r[]建立堆, n為數組長度int i;for(i = n / 2; i >= 1; i--)//i指向最后一個非葉子節點 sift(r, i, n); } 堆排序算法: void HeapSort(Type r[], int n) {crt_heap(r, n);for(i = n; i>= 2 ;--i){r[0] = r[1];r[1] = r[i];r[i] = r[0];//最后一個元素和第一個元素交換位置,把最大的換到最后面去,以此達到升序排列x sift(r, 1, i-1);}} 時間復雜度:O(nlog2(n)). 算法是不穩定的, 空間復雜度O(1) .?
歸并類排序:將兩個或兩個以上的有序表合并成一個表
兩個有序子序列合并算法:?
void Merge(Type r1[], int low, int mid, int high, Type r2[]) {//r1[low...mid]和r1[mid+1,..high]分別按照關鍵字有序排列 ,合并存放在r2[]中int i, j, k;i = low;j = mid + 1;k = low;while(i <= mid && j <= high){if(r1[i].key <= r1[j].key)r2[k++] = r[i++];elser2[k++] = r[j++];}while(i <= mid){r2[k++] = r1[i++];}while(j <= high){r2[k++] = r1[j++];}} 路歸并排序的遞歸算法: void MSort(Type r1[], int low, int high, Type r3[]) {//r1[low...high]排序后放在r3[low...high] 中, r2為輔助空間Type *r2;int mid;r2 = (Type *)malloc(sizeof(Type) * (high - low + 1));if(low == high) r3[low] = r1[low];//這個是遞歸最終退出條件else{//r1前半段放到r2前半段中,同理對于后半段,再將r2合并排序 mid = (low + high) / 2;MSort(r1, low, mid, r2);MSort(r1, mid + 1, high, r2); Merge(r2, low, mid, high, r3);} free(r2);} 調用: void MergeSort(Type r[], int n){MSort(r, 1, n, r); }?
總結
以上是生活随笔為你收集整理的数据结构-第九章 内部排序-知识点总结2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑主板英文标识是什么意思?不同的标识各
- 下一篇: 邻接表1试在邻接表存储结构上实现图的基本