常見排序 總結(我的學習筆記)

2021-07-05 04:49:15 字數 1845 閱讀 1953

簡介:最簡單的插入排序,利用了這樣的事實:位置0—p的元素是排序的,後邊n-p+1個元素向前面已經

排序的元素中插入,需要巢狀迴圈,第一層p—n(p的初始值為1,即前乙個元素是排序的),第二層1—p,

即第一層每個元素需要跟已經排序的元素比較,進而在合適的位置插入,插入….biubiubiu

效率:由於是巢狀迴圈,每次都要n次比較,所以效率是(o (n*n))

穩定性:穩定的

看**:

void insertsort(int a, int n)

}

簡介:是衝破二次時間屏障的第一批演算法之一,原理:通過比較相距一定間隔的元素工作,各趟比較

所用的距離隨著演算法的進行而減小,知道只比較相鄰元素的最後一趟排序為止—在每個增量上進行一次子

陣列插入排序;

效率:o(nlogn)~o(n2),效率依賴增量的設計

穩定性:不穩定;原因:我們知道插入排序是穩定的,但是每個增量上的插入排序可能打亂穩定性

看**:

void shellsort(int a, int n)

// 在合適的位置插入

a[i] = tmp;}}

}

簡介:正如名字,實踐中最快的排序演算法;原理:選出乙個樞紐元素p,待排序陣列前後兩個標記i,j,

a[i]向後移動,a[j]向前移動,如果a[i] > p && a[j] < p 則交換i,j,那麼一趟排序後,資料被分為兩份,前邊的都小於樞紐元素,後邊的都大於樞紐元素,然後分而治之,分別對前後做相同的處理;

效率:(o(n*logn))

穩定性:不穩定

看**:

void quicksort(int a, int left, int right)

}// 一趟比較結束了,我們樞紐元素還在a[left]位置上

// 可以確定的是a[i] 一定是小於等於樞紐元素的,進行交換,這樣

// 樞紐左邊都是小於他的元素,右邊都是大於他的元素

a[left] = a[i];

a[i] = q;

// 分而治之

quicksort(a, left, i - 1);

quciksort(a, i + 1, right);

}

這裡有篇文章配圖講的挺形象的:

快排延伸:

(1)聽過這樣乙個問題,給你乙個大陣列,炒雞大(不能借助輔助陣列什麼的)!有奇數有偶數,

以o(n)時間複雜度,處理以下資料,使得左邊都是奇數,右邊都是偶數。看完快排很快就能想到解題思路,

即:省去「分治」的快排,具體就是定義兩個變數,分別從兩個方向同時遍歷資料,然後進行資料交換;

(2)實踐中,在對少量元素排序時(3 <= n <= 20),插入排序效率要高於快速排序,所以乙個改進的方式

是,快排中元素在比較少時,用插入排序;

不行,我還要默寫一遍快排,八嘎!

void quicksort(int a, int left, int right)

} a[left] = a[low];

a[low] = tmp;

quicksort(a, left, low - 1);

quicksort(a, low + 1, right);

}

// todo

常見排序總結

選擇排序 每一趟選取第i個關鍵字,與剩下的n i關鍵字進行比較,找出最大的值與剛開始選擇的i下標對應的值交換 第一趟 0 1 n 1 第二趟 1,2 n 1 應用場景 最好最壞情況時間複雜度都是o n 2 空間複雜度為o 1 最壞情況 對相對有序的一組資料排序 不穩定 由其交換引起的 適用於數量不大...

常見的排序演算法總結

include 演算法只是比較了元素為整數的內容.大部分的排序只是做了簡單的測試.僅供參考.void swap int a int b bool less int a,int b 對內部中的元素先找到k值,然後分兩塊 int partition int r,int lo,int hi while j...

常見的排序演算法總結

平時一直做專案,業務邏輯,對演算法這塊逐漸有了生疏 今天有空總結一下排序演算法 1 氣泡排序 氣泡排序的原理就是兩兩相比,從小到大的話前面比後面大就交換,從大到大的話前面比後面小就交換,比如有一組數 1,10,5,3,2 如何對它做排序 比如從小到大 第一步 1,10,5,3,2 源資料 1,10,...