資料結構複習筆記01 排序演算法 交換排序

2021-08-03 18:20:41 字數 1934 閱讀 7059

基於交換的排序方法主要有①氣泡排序和②快速排序。文章預設排序演算法是公升序

一、氣泡排序

基本思想:兩兩比較和交換,每次冒出乙個關鍵字最大的記錄。一般有兩層迴圈,一般用兩層for迴圈,外層迴圈只是指定這一趟已經有i個已冒出的數字(從而指定內層遍歷的終點),內層迴圈j是遍歷元素、比較、交換,直到n-i,迴圈結束條件是有一趟內層迴圈未發生交換,則證明有序。

eg:原始序列:12, 34, 20, 15, 9, 25, 27, 13

第一趟: 12 34 20 15 9 25 27 13

12 20 34 15 9 25 27 13 

12 20 15 34 9 25 27 13

12 20 15 9 34 25 27 13 ……

12 20 15 9 25 27 1334

第二趟: 12 15 9 20 25 1327 24

第三趟: 12 9 15 20 1325 27 34

第四趟: 9 12 15 1320 25 27 34

第五趟: 9 12 1315 20 25 27 34

第六趟:9 12 13 15 20 25 27 34

**:

//冒泡

void bubblesort(double r, int length)

} if (!swap) break; //沒發生交換說明有序,結束排序

}}

二、改進的氣泡排序(然並卵)

冒泡過程中如果後面的記錄未發生交換,則證明後面的序列已經有序,常規冒泡還是會進行比較到結束位置。因此每次記錄最後的交換位置,作為下次的比較終點。

eg:23 15 1425 28 30

15 14 2325 28 30//紅色為最後交換時 j 的值

**:

//改進的冒泡

//記錄每一躺最後交換的j作為下一次冒泡的終點

void bubblesortex(double r, int length)

} i = lastindex;

}}

實際提公升效果有限,只有對特殊情況才有很好的效果。

效能方面,空間複雜度有乙個臨時變數作為交換空間,o(1)。

時間複雜度,最好情況,正序,比較n-1次,交換0次。最壞情況,逆序o(n^2),平均o(n^2)。是一種穩定排序

三、快速排序

基本思想是以某個記錄的關鍵字作為基準(劃分元),將整個序列劃分成兩組,左邊的記錄關鍵字小於等於劃分元,右邊的大於等於劃分元,而劃分元所處的位置就是它最終排序好的位置。一般選取當前記錄的第乙個記錄作為劃分元,然後利用遞迴思想快排左右的子記錄,這種思想和二叉樹遍歷很相似,遞迴遍歷他們的子樹。

**:

//快排一次,返回劃分元最終位置

int quickpartition(double r, int low, int high)

r[low] = value; //i為劃分元最終位置

return low;

}//對順序表r[l...h]快排

void quicksort(double r, int low, int high)

//像極了二叉樹先序遍歷

}

效能方面,從空間複雜度來看,遞迴呼叫的層數與n個結點二叉樹的深度相同,因此最好情況o(logn),最差o(n)。

時間複雜度一次劃分需要o(n),最好o(nlogn),最壞情況有序或基本有序,退化為冒泡,o(n^2)。快排不是穩定排序

資料結構複習筆記(一) 排序

資料結構複習筆記 一 這是我的第一天的學習日記 今天主要學的是排序,這裡我們就簡單的講一下幾種常見的排序 先來看排序的輸入輸出 給定乙個任意無序定長陣列num 10 通過 處理後陣列將變成 看似簡單的過程 可以有很多種處理的方法 先看看第一種排序 這種排序演算法的思路就是 將下乙個需要排的元素插入到...

資料結構與演算法複習 一 排序演算法

這篇文章將會介紹常見的排序演算法 使用 c 實現 將陣列分為有序區 左邊 和無序區 右邊 在初始化時有序區為空,無序區包含陣列所有元素 每次從無序區的最後乙個元素開始,一直向前冒泡到無序區的第乙個位置,使其變成有序 templatevoid swap e a,int i,int j template...

資料結構 2 排序演算法

常見的排序演算法 氣泡排序 選擇排序 插入排序 歸併排序 快速排序 堆排序 includeusing namespace std void swap int a,int i,int j 冒泡法 平均時間複雜度 o n 2 void bubblosort int a,int n void bubblo...