陣列合併排序和快速排序

2021-08-20 19:54:59 字數 1983 閱讀 2689

學習c語言的都知道很多時候我們都需要對陣列進行排序,之前給大家分享了選擇排序和氣泡排序,現在給大家分享乙個比較難一點陣列合併排序和快速排序。同樣分析其相應的時間複雜度和空間複雜度。如果分析錯了,還望指點一二。現在輔助合併排序的程式。

合併排序程式方法一:

#include void merge(int r, int s, int x1, int x2, int x3) /*實現一次歸併排序函式*/

else

while (i <= x2)

/*將x1~x2範圍內的未比較的數順次加到陣列r中*/

s[k++] = r[i++];

while (j <= x3)

/*將x2+1~x3範圍內的未比較的數順次加到陣列r中*/

s[k++] = r[j++];

}void merge_sort(int r, int s, int m, int n)

}main()

合併排序程式方法二:

#includevoid main()

,b[5]=,c[8];

int i=0,j=0,k,m,l=0;

while(i<3&&j<5)

} for(k=0;k<8;k++)

printf("%d ",c[k]);

}

第乙個程式執行結果:

第二個程式執行結果:

對於合併排序,先對所要進行排序的序列進行分解,直到分為單個元素為止,然後將其進行兩兩合併。由於最終分解成單個元素,因此在合併的時候.將小數放在前面,大數放在後面,得到乙個有序序列。接下來對兩個相連的有序序列進行排序,先比較有序序列中的第乙個元素,將較小的元素放入臨時陣列中,接著將較小元素所在陣列的下乙個元素與另乙個陣列中的較小元素,比較依次相比。合併排序在最壞的情況下的鍵值比較次數一般為o(nlogn),當n很大時,平均情況下,和平排序演算法的比較次數要小於0.25n次,空間複雜度為o(n)。

對於快速排序演算法,主要是先要選擇乙個中軸,接下來會根據該元素的值來劃分子陣列。選擇中軸有許多不同的策略,主要是針對程式的要求。之後我們講分別從子陣列的兩端進行掃瞄,並且將掃瞄的元素與中軸比較。小於中軸的元素位於子陣列的左半部分,直到遇到第乙個小於等於中軸的元素才會停止。依次這樣排出陣列元素的大小輸出。程式如下:

快速排序程式方法一:

#include #includevoid main()

printf("the sorted numbers:\n");

for (i = 1; i <= 10; i++)

printf("%5d", a[i]);

printf("\n");

}快速排序程式方法二:

#include#includeint a[100];

void f(int i, int j)

//一直重複,直到跳出迴圈體

}if(i快速排序第乙個程式結果:

第二個結果:

對於快速排序演算法,主要是先要選擇乙個中軸,接下來會根據該元素的值來劃分子陣列。選擇中軸有許多不同的策略,主要是針對程式的要求。之後我們講分別從子陣列的兩端進行掃瞄,並且將掃瞄的元素與中軸比較。小於中軸的元素位於子陣列的左半部分,直到遇到第乙個小於等於中軸的元素才會停止。依次這樣排出陣列元素的大小輸出。因此,快速排序的時間複雜度為o(n)

,空間複雜度為o(

1)。合併排序和快速排序相比,感覺合併不太好理解,但是不怕,多做幾次慢慢就熟悉了。上面這兩種排序方法我都採用了兩種程式實現,其實核心思想是沒有變的。都是按照其思想原諒的。

排序方法,合併排序 快速排序

function mergesort myarray var middle math.floor myarray.length 2 left myarray.slice 0,middle right myarray.slice middle params merge mergesort left m...

常用排序演算法 合併排序和快速排序

分治 divide and conquer 是一場常見的演算法策略。分治策略的基本思想就是對於乙個問題規模為n的問題,將其劃分為規模足夠小的k個子問題,子問題由於規模足夠小可以直接求解,最後將規模足夠小的k的問題的解合併得出原問題的解。分治策略的問題的求解過程的一般套路就是 判斷問題規模,足夠小進入...

插入排序 合併排序 堆排序和快速排序

插入排序 時間複雜度o n2 param array原地排序演算法 public void insertsort int array array position present 合併排序 o nlogn param array param left 第乙個索引 param right 最後乙個索引...