Java 實現各種排序演算法以及效能分析

2021-08-27 16:21:54 字數 3923 閱讀 1516

下面將一一實現並分析各種排序演算法

演算法

private static void sort(comparable a)}}

}注:exch(a,j-1,j):交換a[j-1],a[j]的位置

less(a[j],a[j-1]) :比較a[j],a[j-1]的大小,前者小於後者則返回true,反之返回false【以下**都一樣,就不做重複解釋】

每一次遍歷都將最大的元素找出並放到最後,所以冒泡從而得名。複雜度可以說是是有點高了,但是氣泡排序很穩定.

氣泡排序:時間複雜度為o(n^2),

這種排序比較簡單,每次找出最小或者最大的即可,就不多解釋,直接貼出**:

private static void selectsort(comparable a)

}}

public

static

void

insertsort(comparable a)

}}

public

static

void

binaryinsertsort(int data) else

}//將low~i處資料整體向後移動1位

for (int j = i; j > low; j--)

data[low] = tmp;

print(data);}}

}

堆排序,我們需要引入乙個新的概念:優先佇列

許多應用程式都需要處理有序,但不一定要求他們都全部有序,或是不一定要一次就將他們排序。很多情況下,我們會收集一些,處理當前鍵值最大的元素,然後再收集更多的元素,再處理當前鍵值最大的元素,如此這般。例如,你有可能有一台同時執行多個應用程式的電腦。這是通過為每個應用程式的事件分配乙個優先順序,,並總是處理下乙個優先順序最高的事件來實現。此時,並可以引用優先佇列這種資料結構來實現:只支援兩種操作:刪除最大元素和插入元素。

優先佇列可以採用陣列或者鍊錶來實現(利用棧的特性)

演算法如下:

public

class solution else

minstack.push(minstack.isempty() ? node : math.min(minstack.peek(),node));

}public

void

pop()

public

inttop()

public

intmin()

}

通過上面的描述,我們發現操作起來還是不很流暢,插入和刪除需要線性時間才能完成,這還是不夠快,因此,我們引入新的資料結構–堆。我們構建基於二叉堆的優先佇列

先來看看堆的兩種演算法:

- 下沉

//從上至下的下沉演算法

private

void

sink(int k)

}

上浮演算法

private

void

swim(int k)

}

基於堆的優先佇列:

public

class heap>

public boolean isempty()

public

intsize()

private boolean less(int i,int j)

private

void

swap(int i, int j)

private

void

swim(int k)

}private

void

sink(int k)

}/**

* 向二叉堆裡插入新元素

* @param v

*/public

void

insert(comparable v)

/*** 刪除最大元素

* @return

*/public t delmax()

}

有了堆的優先佇列,我們就來看看堆排序的實

public static void heapsort(comparable a)

while (length > 1)

}

先來看看快速排序切分的思想:

private

static

intpartition(comparable a,int start,int end)

exch(a,start,j);

return j;

}

快速排序

private static void quicksort(comparable a,int start,int

end)

希爾排序又叫「`縮小增量排序。其本質其實還是插入排序,但是這裡選取了乙個增量,來加速排序程序。

public

static

void

shellsort(comparable a )

int h = 1;//增量

while(h3)

h = h*3+1;//h=4

while(h>=1)

}h = h/3;//h=4/3=1

}}

歸併排序是指將每種排序分別排序,然後不斷選取合適的範圍進行整合排序,這裡採用了動態規劃的分治思想:分而治之。

private

static

void

merge(comparable a,int start,int m,int end)

for (int k = start; k <= end; k++)

}private

static

void

mergesort(comparable a, int start,int end)

這是乙個比叫有趣的排序,也稱基數排序。基數排序的思想是:「多關鍵字排序」

public

static

void

bucketsort(int arr)}}

//小桶排序

for (int i=0; i//insertion sort

for (int j=1; jif(bucket[i][j]==null)

intvalue = bucket[i][j];

int position=j;

while (position>0 && bucket[i][position-1]>value)

bucket[i][position] = value;}}

//輸出

for (int i=0, index=0; ifor (int j=0; jif (bucket[i][j]!=null)

else}}

}

排序演算法總結:

演算法穩定

時間複雜度

空間複雜度

備註選擇排序

non2

1氣泡排序

yesn2

1插入排序

yesn \~ n2

1時間複雜度和初始順序有關

希爾排序

non 的若干倍乘於遞增序列的長度

1快速排序

nonlogn

logn

三向切分快速排序

non \~ nlogn

logn

適用於有大量重複主鍵

歸併排序

yesnlogn

n堆排序

nonlogn

1

各種排序演算法java實現

插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...

各種排序演算法java實現

插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...

各種排序演算法java實現

插入排序 package org.rut.util.algorithm.support import org.rut.util.algorithm.sortutil author treeroot since 2006 2 2 version 1.0 public class insertsort ...