排序並不是一種演算法思想,而是基於遍歷的一種演算法實現。形形色色的排序演算法,並不能絕對的認為哪一種排序最好,因為最好的度量指標究竟是耗時、記憶體占用亦或是穩定性是不確定的,這個要根據使用場景來決定,但是我們必須掌握各種排序方法的實現原理,這樣才能做到「具體問題具體分析」。下圖為多種排序演算法的特性歸納:
參考:各種排序**展示直接選擇排序(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、依次比較當前資料與上一資料大小,作插入動作,每一次插入都能保證右側值大於左側值,最後就形成由小到大的排序
插入排序**
氣泡排序從小到大排序:一開始交換的區間為0 ~ n-1,將第1個數和第2個數進行比較,前面大於後面,交換兩個數,否則不交換。再比較第2個數和第三個數,前面大於後面,交換兩個數否則不交換。依次進行,最大的數會放在區間最後的位置(完成一次冒泡)。然後將範圍變為0~n-2,再做冒泡,最終陣列第二大的數會放在陣列倒數第二的位置。依次進行整個交換過程,最後範圍只剩乙個數時陣列即為有序。//array為待排序陣列,n為陣列長度
void
insertsort
(int array,
int n)
array[j]
=temp;
//空出的位置放置比較值,實現乙個資料插入}}
}
快速排序從小到大排序:在陣列中隨機選乙個數(預設陣列首個元素,本例程中使用隨機演算法優化了快速排序,參考:舍伍德優化快速排序),陣列中小於等於此數的放在左邊,大於此數的放在右邊,再對陣列兩邊遞迴呼叫快速排序,重複這個過程。//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 ...