已會的排序技術

2021-09-12 18:42:36 字數 2616 閱讀 2885

1.氣泡排序

2.簡單選擇排序(直接排序)

3.快速排序

4.shell排序(不太熟練)

5.歸併排序(不太熟練)(對**理解還不到位)

一:氣泡排序

演算法思想: 

從陣列中第乙個數開始,依次遍歷陣列中的每乙個數,通過相鄰比較交換,每一輪迴圈下來找出剩餘未排序數的中的最大數並」冒泡」至數列的頂端。

演算法步驟: 

(1)從陣列中第乙個數開始,依次與下乙個數比較併次交換比自己小的數,直到最後乙個數。如果發生交換,則繼續下面的步驟,如果未發生交換,則陣列有序,排序結束,此時時間複雜度為o(n); 

(2)每一輪」冒泡」結束後,最大的數將出現在亂序數列的最後一位。重複步驟(1)。

穩定性:穩定排序。

時間複雜度: o(n)至o(n2),平均時間複雜度為o(n2)。

最好的情況:如果待排序資料序列為正序,則一趟冒泡就可完成排序,排序碼的比較次數為n-1次,且沒有移動,時間複雜度為o(n)。

最壞的情況:如果待排序資料序列為逆序,則氣泡排序需要n-1次趟起泡,每趟進行n-i次排序碼的比較和移動,即比較和移動次數均達到最大值: 

比較次數:cmax=∑i=1n−1(n−i)=n(n−1)/2=o(n2) 

移動次數等於比較次數,因此最壞時間複雜度為o(n2)。

示例**:

void bubblesort(int array,int len)

}if(noswap) break;}}

二.簡單選擇排序原理:從所有記錄中選出最小的乙個資料元素與第乙個位置的記錄交換;然後在剩下的記錄當中再找最小的與第二個位置的記錄交換,迴圈到只剩下最後乙個資料元素為止。

穩定性:不穩定排序。

時間複雜度: 最壞、最好和平均複雜度均為o(n2),因此,簡單選擇排序也是常見排序演算法中效能最差的排序演算法。簡單選擇排序的比較次數與檔案的初始狀態沒有關係,在第i趟排序中選出最小排序碼的記錄,需要做n-i次比較,因此總的比較次數是:∑i=1n−1(n−i)=n(n−1)/2=o(n2)。

示例**:

void selectsort(int a,int len)

int left=low;

int right=high;

int key=a[left]; /*用陣列的第乙個記錄作為分割槽元素*/

while(left!=right)

if((j+inc)!=i)//防止自我插入

a[j+inc]=temp;//插入記錄}}

}

注意:從**中可以看出,增量每次變化取前一次增量的一般,當增量d等於1時,shell排序就退化成了直接插入排序了。

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為2-路歸併。 

5.1 演算法描述

5.2 **演示

5.3 **實現

function mergesort(arr)

varmiddle = math.floor(len / 2),

left = arr.slice(0, middle),

right = arr.slice(middle);

returnmerge(mergesort(left), mergesort(right));

}

function merge(left, right)else

}

while(left.length)

result.push(left.shift());

while(right.length)

result.push(right.shift());

returnresult;

}

5.4 演算法分析

歸併排序是一種穩定的排序方法。和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是o(nlogn)的時間複雜度。代價是需要額外的記憶體空間。

歡樂技術英雄會

在這個技術喧嘩的時代,網際網路就是江湖。江湖多凶險,但是很公平,只要有才能的人,就能成名,他們就是網際網路上的英雄 有的人天生就是英雄,無論他是否出生在亂世,在和平的年代他們是歡樂的英雄。夫網際網路英雄者,今朝胸懷技術泰斗,腹有安全良謀,有包藏天下軟體之機,吞吐萬難之志。2007技術英雄大會,他們將...

歡樂技術英雄會

在這個技術喧嘩的時代,網際網路就是江湖。江湖多凶險,但是很公平,只要有才能的人,就能成名,他們就是網際網路上的英雄 有的人天生就是英雄,無論他是否出生在亂世,在和平的年代他們是歡樂的英雄。夫網際網路英雄者,今朝胸懷技術泰斗,腹有安全良謀,有包藏天下軟體之機,吞吐萬難之志。2007技術英雄大會,他們將...

靈活運用的技術已實現

這些天webservice發展。理想情況下,資料傳輸自己的自定義類的陣列。時間的考驗前,串 hello,webservice 做測試,乙個非常成功的例子 後來,當複雜的資料型別的陣列。我的合作夥伴已接收的資料少。一直持續了大概乙個月,是在沒辦法,導師出馬了。建議我們把這些資料用xml檔案封裝起來。在...