最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java幾種排序算法的實(shí)現(xiàn)及簡單分析

 更新時間:2015年05月30日 16:25:39   作者:hitxueliang  
這篇文章主要介紹了java幾種排序算法的實(shí)現(xiàn)及簡單分析,實(shí)例分析了插入排序、希爾排序、選擇排序等常用排序算法,并分析了各個算法的優(yōu)劣,需要的朋友可以參考下

本文實(shí)例講述了java幾種排序算法的實(shí)現(xiàn)及簡單分析。分享給大家供大家參考。具體如下:

package test;
public class first {
/*普通的插入排序*/
public void insertSort(int[] list) {
int i, j;
list[0] = -999;
//相當(dāng)于設(shè)置一個監(jiān)視哨兵,不用判斷是否越界,
//但要求數(shù)組從第二個數(shù)開始即i=1開始存儲
for (i = 1; i < list.length; i++) {
j = i;
while (list[j] < list[j - 1]) {
int temp = list[j];
list[j] = list[j - 1];
list[j - 1] = temp;
j = j - 1;
}
}
}
/*折半插入,在直接插入的基礎(chǔ)上,添加二叉查找*/
public void binInsertSort(int[] r, int low, int high) {
for (int i = low + 1; i <= high; i++)
{
int temp = r[i]; // 保存待插入元素
int hi = i - 1;
int lo = low; // 設(shè)置初始區(qū)間
while (lo <= hi)
{ // 折半確定插入位置
int mid = (lo + hi) / 2;
if (temp < r[mid])
hi = mid - 1;
else
lo = mid + 1;
}
for (int j = i - 1; j > hi; j--)
r[j + 1] = r[j]; // 移動元素
r[hi + 1] = temp; // 插入元素
}
}
/*希爾排序或shell */
public void shellSort(int[] r, int low, int high, int[] delta){
for (int k=0;k<delta.length;k++)
shellInsert(r, low, high, delta[k]);
}
private void shellInsert(int[] r, int low, int high, int deltaK){
for (int i=low+deltaK; i<=high; i++)
if (r[i]<r[i-deltaK]){
int temp = r[i];
int j = i-deltaK;
for(; j>=low&&temp<r[j]; j=j-deltaK)
r[j+deltaK] = r[j];
r[j+deltaK] = temp;
}
}
/*簡單的選擇交換*/
public void selectSort(int[] r, int low, int high) {
for (int k = low; k < high - 1; k++) { // 作n-1 趟選取
int min = k;
for (int i = min + 1; i <= high; i++)
// 選擇關(guān)鍵字最小的元素
if (r[i] < r[min])
min = i;
if (k != min) {
int temp = r[k]; // 關(guān)鍵字最小的元素與元素r[k]交換
r[k] = r[min];
r[min] = temp;
}// end of if
}
}
/*堆排序-大頂堆*/
public void heapSort(int[] r){
int n = r.length - 1;
for (int i=n/2; i>=1; i--)
heapAdjust(r,i,n);
for (int i=n; i>1; i--){
int temp = r[1];
r[1] = r[i];
r[i] = temp;
heapAdjust(r,1,i-1);
}
}
//調(diào)整堆
private void heapAdjust(int[] r, int low, int high){
int temp = r[low];
for (int j = 2 * low; j <= high; j = j * 2) {
if (j < high && r[j] < r[j + 1])
j++;
if (temp > r[j])
break;
r[low] = r[j];
low = j;
}
r[low] = temp;
}
public static void main(String[] args) {
first fs = new first();
int[] a = { 100, 9, 8, 9, 9, 7, 7, 0, 0, 99, 55, 7, 6, 5, 4, 3, 2, 1 };
int[] k={5,3,1};
// fs.insertSort(a);
//fs.binInsertSort(a, 0, a.length - 1);
//fs.shellSort(a, 0,a.length-1,k);
//fs.selectSort(a, 0, a.length-1);
fs.heapSort(a);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}

插入排序、交換排序、選擇排序、歸并排序等排序方法,都有一個共同的特點(diǎn),那就是它們都是通過比較元素的大小來確定元素之間的相對位置的,即上述排序方法都是基于比較的排序方法。下面,我們就基于比較的排序方法進(jìn)行一個對比和總結(jié)。
我們主要從算法的平均時間復(fù)雜度、最壞時間復(fù)雜度、空間復(fù)雜度以及排序的穩(wěn)定性等方面,對各中排序方法加以比較。

排序方法 平均時間復(fù)雜度最壞時間復(fù)雜度空間復(fù)雜度 穩(wěn)定性
直接插入排序 Ο(n2) Ο(n2) Ο(1) 穩(wěn)定
起泡排序 Ο(n2) Ο(n2) Ο(1) 穩(wěn)定
快速排序 Ο(n log n) Ο(n2) Ο(log n) 不穩(wěn)定
簡單選擇排序 Ο(n2) Ο(n2) Ο(1) 不穩(wěn)定
堆排序 Ο(n log n) Ο(n log n) Ο(1) 不穩(wěn)定
歸并排序 Ο(n log n) Ο(n log n) Ο(n) 穩(wěn)定

從時間性能上看,快速排序是所有排序算法中實(shí)際性能最好的,然而快速排序在最壞情況下的時間性能不如堆排序和歸并排序。這一點(diǎn)可以通過對快速排序進(jìn)行改進(jìn)來避免,一種通過隨機(jī)選擇樞軸元素的隨機(jī)快速排序,可以使得出現(xiàn)最壞情況出現(xiàn)的幾率非常小,在實(shí)際的運(yùn)用中可以認(rèn)為不存在。在堆排序和歸并排序的比較中,當(dāng)n 較大時,歸并排序所需時間較少,然而它需要較多的輔助存儲空間。

從方法穩(wěn)定性上來看,大多數(shù)時間復(fù)雜度為Ο(n2)的排序均是穩(wěn)定的排序方法,除簡單選擇排序之外。而多數(shù)時間性能較好的排序方法,例如快速排序、堆排序、希爾排序都是不穩(wěn)定的。一般來說,排序過程中的比較是在相鄰的兩個元素之間進(jìn)行的排序方法是穩(wěn)定的。

并且,排序方法的穩(wěn)定性是由方法本身決定的,對于不穩(wěn)定的排序方法而言,不管其描述形式如何,總能找到一種不穩(wěn)定的實(shí)例。

綜上所述,上面討論的所有排序方法中,沒有哪一個是絕對最優(yōu)的,在實(shí)際的使用過程中,應(yīng)當(dāng)根據(jù)不同情況選擇適當(dāng)?shù)呐判蚍椒ā?/p>

希望本文所述對大家的java程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評論

阿克苏市| 长宁县| 屏东市| 沧州市| 合川市| 乌兰察布市| 石景山区| 镇江市| 石棉县| 罗田县| 五河县| 柳江县| 阿拉善左旗| 开鲁县| 云和县| 平遥县| 天气| 巴东县| 尚义县| 汝城县| 松滋市| 花莲市| 新乐市| 客服| 鹿泉市| 和顺县| 威宁| 集贤县| 乌审旗| 左云县| 瓦房店市| 浙江省| 深州市| 东乡族自治县| 龙口市| 苍山县| 新沂市| 正蓝旗| 武功县| 宜丰县| 阿拉善右旗|