學習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 最後乙個索引...