下面將一一實現並分析各種排序演算法
演算法
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 ...