講述部分排序演算法的實現與利弊概念:我認為你們掌握氣泡排序,歸併排序,快速排序這三種足以
在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現他們的排序與排序要求相反時,就將他們互換。**實現
#include
int a[11]
=;/* 氣泡排序 */
intmain()
}}for(i=
1;i<=
10;i++
)printf
("%d "
,a[i]);
return0;
}
因為有兩層迴圈,n*n
概念:
先將整個待排序元素序列分割成若干子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序(因為直接插入排序在元素基本有序的情況下,效率很高)這個排序演算法還有乙個特殊用處:求逆序對(以後再講)
**實現:
#include
#include
int a[9]
=;int b[9]
;//用來存放某個階段的區域性的排序,然後再覆蓋到a陣列上
/* 歸併排序 */
/* 我用|將其隔開
遞迴7 8 9 3|1 3 5 2
7 8|8 3|1 3|5 2
7|8|8|3|1|3|5|2 ---->分割到最小
回溯7 8|3 8|1 3|2 5
3 7 8 8|1 2 3 5
1 2 3 3 5 7 8 8
*/void
merge
(int l,
int mid,
int r)
else
}else
else}}
int i;
for(i=l;i<=r;i++
)a[i]
= b[i]
;//覆蓋
}void
mergesort
(int l,
int r)
}int
main()
實不相瞞,這個我以前也不是很懂,就剛才寫這個地方的時候查查資料自己想了想就寫出來了。很簡單的。
歸併排序還涉及到了分治思想,能思考出來時怎麼一回事嗎?
對於原理不是很懂的,可以在網上找一找歸併排序過程的圖,再想一想。我的**就代表了過程。
時間複雜度(nlog2n)穩定且比冒泡快
這是這三個之中最難理解的乙個演算法(個人認為)
其基本思想是:
1、先從數列中取出乙個數作為基準數
2、分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊
3、再對左右區間重複第二步,直到各區間只有乙個數
**實現
#include
#include
int a[9]
=;/* 快速排序 */
void
qsort
(int l,
int r)
a[i]
= tmp;
qsort
(l,i-1)
;qsort
(i+1
,r);}}
intmain()
關於排序過程的圖,網上都有,可以自己找找看看。這裡不再過多敘述。 演算法 面試題 16 16 部分排序
給定乙個整數陣列,編寫乙個函式,找出索引m和n,只要將索引區間 m,n 的元素排好序,整個陣列就是有序的。注意 n m盡量最小,也就是說,找出符合條件的最短序列。函式返回值為 m,n 若不存在這樣的m和n 例如整個陣列是有序的 請返回 1,1 示例 0 len array 1000000 解法 如果...
一道部分排序題
題目 時間限制 4000ms 給你n個整數,請按從大到小的順序輸出其中前m大的數。input 每組測試資料有兩行,第一行有兩個數 n,m 0 n,m 4000000 第二行包含n個各不相同,且都處於區間 2000000,2000000 的整數。output 對每組測試資料按從大到小的順序輸出前m大的...
資料結構與演算法 第11部分 排序
1 直接插入排序 演算法步驟 1 設待排度的記錄儲存在陣列r 1.n 中,可以把第乙個記錄r 1 看作乙個有序序列。2 依次將r i i 2,n 插入到已經排好序的序列r 1.i 1 中,並保持有序性。void straightinsertsort int r,int n 直接插入排序 r 0 r ...