部分排序演算法的實現

2021-10-02 02:02:30 字數 2030 閱讀 4961

講述部分排序演算法的實現與利弊

我認為你們掌握氣泡排序,歸併排序,快速排序這三種足以

概念:

在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現他們的排序與排序要求相反時,就將他們互換。

**實現

#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 ...