排序的穩定性:
如果在序列中有兩個資料元素 r[i] 和 r[j],它們的關鍵字 k[i]== k[j],且在排序之前,物件 r[i] 排在 r[j] 前面;
如果在排序之後,物件 r[i]仍在物件 r[j] 的前面,則稱這個排序方法是穩定的,否則稱這個排序方法是不穩定的。
排序的重要指標:
排序的時間複雜度
排序的空間複雜度
排序演算法的可讀性與可維護性
多關鍵字與單關鍵字的排序無本質區別,只是在第一關鍵字相同時,再去比較第二關鍵字繼續排序,以此類推。
tip:
sort類中都提供了asc(bool型別)變數,可以選擇(true)公升序或降序(false)排序。預設為公升序
因為待排序的物件不一定為基本型別,所以使用模板技術,可以對支援比較與交換的資料物件進行排序。
下面是交換函式(模板)。
template
<
typename t >
static
void
swap
(t& a,t& b)
選擇排序的基本思想:
每次(例如第i次,i=0,1,…,n-2)從後面的n-i個待排資料元素中
選出最小(大)的元素,作為排序後的第i個元素
不多說,選擇排序看**應該就可以理解了,不理解就多看兩遍。
/* 選擇排序 o(n2)
不穩定排序
*/template
<
typename t >
static
void
select
(t arr,
int len,
bool asc =
true)}
if(spe != i)
}}
插入排序的基本思想:
當插入第i(i>=1)個資料元素時,前面的v[0],v[1],…'v[i-1]已經排好序;
這時,用v[i]的關鍵字與v[i-1],v[i-2],…,v[0]的關鍵字進行比較,
找到位置後將v[i]插入,原來位置上的物件向後順移。
流程簡述:
0:(外圍大迴圈 0-n)
1:拷貝當前待排序資料(待排序資料順序為從前向後),向前比較
2:若比較成立(逆序),當前被比較資料向後順移一位,記錄當前下標,向前比較,重複2
3:若比較不成立,記錄的下標與待排序資料的下標是否一致
4:不一致,將待排序資料插入至此
5:一致,不需要操作
/* 插入排序 o(n2)
穩定排序
*/template
<
typename t >
static
void
insert
(t arr,
int len,
bool asc =
true)if
(spe != i)
}}
氣泡排序的基本思想:
每次從後向前進行(假設第i次),j=n-1,n-2,…,i,
兩兩比較v[j-1]和v[j]的關鍵字;
如果發生逆序,則交換v[j-1]和v[j]
流程簡述:
0:(外圍大迴圈 0-n)
1:當前待排序資料(待排序資料順序為從後向前)向前比較
2:若比較成立(逆序),當前被比較資料與待排序資料交換位置
3:若比較不成立,不需要操作
4:重複1
tip:
採用exchange(bool型別)標記當前排序資料是否發生位置移動,如果沒發生,說明資料已經排好序,可以提前結束排序操作,提高效率
/* 氣泡排序 o(n2)
穩定排序
*/template
<
typename t >
static
void
bubble
(t arr,
int len,
bool asc =
true)}
}}
排序sort 排序用法
語法 array sort fun 引數fun可選。規定排序順序。必須是函式。注 如果呼叫該方法時沒有使用引數,將按字母順序對陣列中的元素進行排序,說得更精確點,是按照字元編碼的順序進行排序。如果想按照其他規則進行排序,就需要提供比較函式,該函式要比較兩個值,然後返回乙個用於說明這兩個值的相對順序的...
sort排序 1和1的區別
這個是sort方法裡的那個比較函式的特殊的返回值,比較函式的引數 a 和 b 代表陣列裡的兩個元素,如果 a 小於 b,排序後的陣列 a 在 b 前面,此時返回乙個負數 即上面的 return 1 如果 a 等於 b,排序後兩者位置不變,此時返回 0 即上面的 return 0 如果 a 大於 b,...
氣泡排序,選擇排序,sort排序
1.首先用scanf接收n個同學,然後在鍵盤上輸入n個同學的姓名和成績,空格分開。然後輸入1 2 3 序號分別選擇三種排序方式,回車結束。程式會自動根據你選擇的排序方式進行排序。2.首先用scanf接收有幾個數字,然後輸入n個無序的數。呼叫快速排序函式,得出結果。include include us...