演算法思想 排序

2021-10-09 09:50:24 字數 4386 閱讀 2987

排序並不是一種演算法思想,而是基於遍歷的一種演算法實現。形形色色的排序演算法,並不能絕對的認為哪一種排序最好,因為最好的度量指標究竟是耗時、記憶體占用亦或是穩定性是不確定的,這個要根據使用場景來決定,但是我們必須掌握各種排序方法的實現原理,這樣才能做到「具體問題具體分析」。下圖為多種排序演算法的特性歸納:

參考:各種排序**展示

直接選擇排序(straight select sorting) 是一種簡單的排序方法,它的基本思想是:第一次從r[0] ~ r[n-1]中選取最小值,與r[0]交換,第二次從r[1] ~ r[n-1]中選取最小值,與r[1]交換,…,第i次從r[i-1] ~ r[n-1]中選取最小值,與r[i-1]交換,…,第n-1次從r[n-2] ~ r[n-1]中選取最小值,與r[n-2]交換,總共通過n-1次,得到乙個按排序碼從小到大排列的有序序列。

時間複雜度:o(n^2) 穩定性:不穩定

//判斷是否下標發生改變}}

intmain

(void);

seletedsont

(a,7);

for(

int i=

0;i<

7;i++

)return0;

}趟數

監視哨排序結果125

(12,)25,36,45,2,9,39,22,98,37212

(12,25,)36,45,2,9,39,22,98,37336

(12,25,36,)45,2,9,39,22,98,37445

(12,25,36,45,)2,9,39,22,98,3752

(2,12,25,36,45,)9,39,22,98,3769

(2,9,12,25,36,45,)39,22,98,37739

(2,9,12,25,36,39,45,)22,98,37822

(2,9,12,22,25,36,39,45,)98,37998

(2,9,12,22,25,36,39,45,98,)37

1037

(2,9,12,22,25,36,37,39,45,98,)

插入排序會將某一值插入到合適位置,其它資料作相應移動,因此稱之為插入排序。

1、將第二個資料與第乙個比較,如果第二個資料小,則第乙個資料右移乙個位置,第乙個資料空出的位置放置第二個資料

2、將第三個資料與第二個比較,如果第三個資料小,則依次與第二個、第乙個資料比較,若第三個資料最小,則將第

一、第二個資料依次右移乙個位置,最左邊空出的位置放置第三個資料;若第三個資料比第二個資料小,但是比第乙個資料大,則只將第二個資料右移乙個位置,原先第二資料的位置放置第三個資料。

3、依次比較當前資料與上一資料大小,作插入動作,每一次插入都能保證右側值大於左側值,最後就形成由小到大的排序

插入排序**

//array為待排序陣列,n為陣列長度

void

insertsort

(int array,

int n)

array[j]

=temp;

//空出的位置放置比較值,實現乙個資料插入}}

}

氣泡排序從小到大排序:一開始交換的區間為0 ~ n-1,將第1個數和第2個數進行比較,前面大於後面,交換兩個數,否則不交換。再比較第2個數和第三個數,前面大於後面,交換兩個數否則不交換。依次進行,最大的數會放在區間最後的位置(完成一次冒泡)。然後將範圍變為0~n-2,再做冒泡,最終陣列第二大的數會放在陣列倒數第二的位置。依次進行整個交換過程,最後範圍只剩乙個數時陣列即為有序。

//array為待排序陣列,n為陣列長度

void

bubblesort

(int array,

int n)

}}

快速排序從小到大排序:在陣列中隨機選乙個數(預設陣列首個元素,本例程中使用隨機演算法優化了快速排序,參考:舍伍德優化快速排序),陣列中小於等於此數的放在左邊,大於此數的放在右邊,再對陣列兩邊遞迴呼叫快速排序,重複這個過程。

//將a[0]內資料放到a[left]位置

a[left]

= temp;

//以left作為分界,將序列分為左右兩部分

return left;

}void

quicksort

(int a,

int left,

int right)

}int

main()

;quicksort

(a,0,10

);for(

int i =

0; i<

11; i++

)return0;

}假設隨機出的起始資料是a[0] = 35,那麼一次randpartition的過程如下:

int a[11] = ; //原始資料

int a[11] = ; //right=9,a[9]資料拷貝到a[0]

int a[11] = ; //left=3, a[3]資料拷貝到a[9]

int a[11] = ; //right=6, a[6]資料拷貝到a[3]

int a[11] = ; //left=5, a[5]資料拷貝到a[6]

int a[11] = ; //right=5, 不滿足left int a[11] = ; //left=right-5,將起始資料拷貝到a[5]

此時a[5]左邊的資料全部小於35,右邊的資料全部大於35,後面再對, 分別進行上述操作

排序的實質是按照大小關係排列資料,通常都需要以此比較兩個資料的大小,實際上資料量為4個序列排序,可以看做兩組資料量為2的序列的組合,先將子串行排序,再講子串行合併就能得到最終的排序序列。這一過程與分治思想完全吻合,可按照如下步驟來做:

1、分解:將待排序序列逐級分解,直到序列的資料量為1個

2、解決:反向排序,即對每乙個數量為1的序列排序(實質乙個資料不需要排序)

3、合併:反向合併,按照分解順序反向組合,組合式要考慮同時排序

}//左邊序列先到達結尾,則右邊序列剩餘資料依次放到result

if(i == mid +1)

//右邊序列先到達結尾,則左邊序列剩餘資料依次放到result

if(j == end +1)

for(j =

0, i = start ; j < k; i++

, j++)}

void

mergesort

(int arr,

int start,

int end)

intmain()

;mergesort

(arr,0,

9);printlist

(arr,10)

;system

("pause");

return0;

}

排序演算法思想描述

排序演算法思想描述 qpz 一 直接選擇排序法 a 核心思想 在無序區間尋找最值與無序區間首元素交換 遍歷所有元素排序 1.記錄無序區間第乙個元素位置 2.向後遍歷所有元素尋找最值位置 尋找最大值還是最小值取決於降序還是公升序 3.遍歷結束以後找到最值,交換與記錄點的位置,記錄點向後移動一位 4.重...

氣泡排序演算法思想

冒泡思想 就是通過兩兩比較a,b,如果a比b大,就把a的位置跟b交換,接著比下去,直到最大的元素出現在最後的位置。package sort 氣泡排序思想 1 比較最開始相鄰的元素 如果這個元素大就往後移,2 接著比較下一組元素直到該元素到了最後 3 接著重複操作 4 直到元素排好序 public c...

排序演算法思想總結

對於一名碼農來說,熟悉資料結構和演算法是最基本的,總結了一下各種排序演算法的思想 例如 乙個待排序數列a 1 4 7 2 5 8 3 6 9 要求從小到大排序 一 氣泡排序 對待排序數列從最後一位元素開始依次比較大小,一次迴圈比較n 1次之後即可將最小值放在首位,即a n 1 與a n 2 a n ...