十種JAVA排序演算法例項

2021-09-07 05:00:24 字數 4120 閱讀 1684

一、冒泡(bubble)排序

複製** **如下:

void bubblesortarray()

} }

} 效率 o(n²),適用於排序小列表。

二、選擇排序

複製** **如下:

void selectsortarray()

arr[j+1]=temp;

} }

最佳效率o(n);最糟效率o(n²)與冒泡、選擇相同,適用於排序小列表

若列表基本有序,則插入排序比冒泡、選擇更有效率。

複製** **如下:

void shellsortarray()

arr[j+incr]=temp;

} }

} }

適用於排序小列表。

效率估計o(nlog2^n)~o(n^1.5),取決於增量值的最初大小。建議使用質數作為增量值,因為如果增量值是2的冪,則在下乙個通道中會再次比較相同的元素。

殼(shell)排序改進了插入排序,減少了比較的次數。是不穩定的排序,因為排序過程中元素可能會前後跳躍。

複製** **如下:

void mergesort(int low,int high)

else

} for(   ;j<=high;j++,k++)//如果第二個子列表中仍然有元素,則追加到新列表

b[k]=arr[j];

for(   ;i<=mid;i++,k++)//如果在第乙個子列表中仍然有元素,則追加到新列表中

b[k]=arr[i];

for(int z=0;z

效率o(nlogn),歸併的最佳、平均和最糟用例效率之間沒有差異。

適用於排序大列表,基於分治法。

複製** **如下:

/*快速排序的演算法思想:選定乙個樞紐元素,對待排序序列進行分割,分割之後的序列乙個部分小於樞紐元素,乙個部分大於樞紐元素,再對這兩個分割好的子串行進行上述的過程。*/                  void swap(int a,int b)

int partition(int arr,int low,int high)

//將這個比樞紐元素小的元素交換到前半部分

swap(arr[low], arr[high]);

//從前往後在前半部分中尋找第乙個大於樞紐元素的元素

while (low

平均效率o(nlogn),適用於排序大列表。

此演算法的總時間取決於樞紐值的位置;選擇第乙個元素作為樞紐,可能導致o(n²)的最糟用例效率。若數基本有序,效率反而最差。選項中間值作為樞紐,效率是o(nlogn)。

基於分治法。

七、堆排序

最大堆:後者任一非終端節點的關鍵字均大於或等於它的左、右孩子的關鍵字,此時位於堆頂的節點的關鍵字是整個序列中最大的。

思想:

(1)令i=l,並令temp= kl ;

(2)計算i的左孩子j=2i+1;

(3)若j<=n-1,則轉(4),否則轉(6);

(4)比較kj和kj+1,若kj+1>kj,則令j=j+1,否則j不變;

(5)比較temp和kj,若kj>temp,則令ki等於kj,並令i=j,j=2i+1,並轉(3),否則轉(6)

(6)令ki等於temp,結束。

複製** **如下:

void heapsort(seqiast r)

}堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過呼叫heapify實現的。

堆排序的最壞時間複雜度為o(nlgn)。堆排序的平均效能較接近於最壞效能。     由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。     堆排序是就地排序,輔助空間為o(1),     它是不穩定的排序方法。

堆排序與直接插入排序的區別:

直接選擇排序中,為了從r[1..n]中選出關鍵字最小的記錄,必須進行n-1次比較,然後在r[2..n]中選出關鍵字最小的記錄,又需要做n-2次比較。事實上,後面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經做過,但由於前一趟排序時未保留這些比較結果,所以後一趟排序時又重複執行了這些比較操作。

堆排序可通過樹形結構儲存部分比較結果,可減少比較次數。

八、拓撲排序

例 :學生選修課排課先後順序

拓撲排序:把有向圖中各頂點按照它們相互之間的優先關係排列成乙個線性序列的過程。

方法:

在有向圖中選乙個沒有前驅的頂點且輸出

從圖中刪除該頂點和所有以它為尾的弧

重複上述兩步,直至全部頂點均已輸出(拓撲排序成功),或者當圖中不存在無前驅的頂點(圖中有迴路)為止。

複製** **如下:

void topologicalsort()/*輸出拓撲排序函式。若g無迴路,則輸出g的頂點的乙個拓撲序列並返回ok,否則返回error*/

data[size];

long comparenum=0;

long exchangenum=0;

long read(char name)//讀取檔案a.txt中的資料,並存放在陣列data中;最後返回資料的個數

return (i-1);

} long create(long num)//建立勝者樹,返回冠軍(最小數)在陣列data中的下標

for(i=1;i<=max;i+=2)//第一輪比賽

else

} j1=j2=0;//記錄連續的兩個未被淘汰的選手的下標

while(time <= (log(max)/log(2)))//進行淘汰賽

else//同理

} }

} time++;//輪數加1

} return min;//返回冠軍的下標

} void tournamentsort(long num)//錦標賽排序

} int main()

複製** **如下:

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace learnsort

public static void radixsort(ref int arr)

private static void radixsort(ref int arr, int imaxlength)

//從個位向高位開始分桶

catch //如果發生異常,則將該數壓入listarr[0]。比如說5 是沒有十位數的,執行上面的操作肯定會發生越界異常的,這正是期望的行為,我們認為5的十位數是0,所以將它壓入listarr[0]的桶裡。

switch (currnetchar)//通過currnetchar的值,確定它壓人哪個桶中。

} for (int j = 0; j < listarr.length; j++)//將十個桶裡的資料重新排列,壓入list

foreach (int number in listarr[j].toarray())

arr = list.toarray();//arr指向重新排列的元素

" times:",i);

print(arr);//輸出一次排列的結果

list.clear();//清空list

} }

//得到最大元素的位數

private static int getmaxlength(int arr)

return imaxnumber.tostring().length;//這樣獲得最大元素的位數是不是有點投機取巧了...

} //輸出陣列元素

public static void print(int arr)

//產生隨機數組。隨機數的範圍是0到1000。引數ilength指產生多少個隨機數

public static int createrandomarray(int ilength)

} }

基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的比較性排序法。 

十種JAVA排序演算法例項

一 冒泡 bubble 排序 複製 如下 void bubblesortarray 效率 o n 適用於排序小列表。二 選擇排序 複製 如下 void selectsortarray arr j 1 temp 最佳效率o n 最糟效率o n 與冒泡 選擇相同,適用於排序小列表 若列表基本有序,則插入...

十種排序演算法

1.常見演算法分類 十種常見排序演算法一般分為以下幾種 1 非線性時間比較類排序 交換類排序 快速排序和氣泡排序 插入類排序 簡單插入排序和希爾排序 選擇類排序 簡單選擇排序和堆排序 歸併排序 二路歸併排序和多路歸併排序 2 線性時間非比較類排序 計數排序 基數排序和桶排序。總結 1 在比較類排序中...

js實現十種排序演算法

排序演算法 平均情況 最好情況 最壞情況 空間複雜度 穩定性氣泡排序 o n2 o n o n2 o 1 穩定快速排序 o nlog2n o nlog2n o n2 o log2n o n 不穩定直接插入排序 o n2 o n o n2 o 1 穩定希爾排序 o nlog2n o n2 o n1.3...