7つのよくある並べ替えアルゴリズムのまとめ
開発ツール
テストプラットフォーム
プロジェクト名
日付
作者
コメント
V 1.0
2016.04.06
lutianfei
none
V 1.1
2016.07.16
lutianfei
正規並べ替えの説明を追加しました.
V 2.0
2016.07.19
lutianfei
順序付けアルゴリズムのまとめを改善しました.
平均して
ベスト?コンディション
最悪の場合
補助スペース
安定性
泡の並べ替え
O(n^2)
O(n)
O(n^2)
O(1)
安定している
並べ替えを簡単に選択
O(n^2)
O(n^2)
O(n^2)
O(1)
安定している
並べ替えの直接挿入
O(n^2)
O(n)
O(n^2)
O(1)
安定している
ヒルの並べ替え
O(nlogn)~O(n^2)
O(n^1.3)
O(n^2)
O(1)
不安定です
積み上げ順序
O(nlogn)
O(nlogn)
O(nlogn)
O(1)
不安定です
並べ替え
O(nlogn)
O(nlogn)
O(nlogn)
O(n)
安定している
クイックソート
O(nlogn)
O(nlogn)
O(n^2)
O(logn)~O(n)
不安定です
public static void main(String[] args) {
int[] A = new int[] { 11, 2, 3, 22, 4, 1, 11, 10, 6, 5, 22, 13, 21 };
int n = A.length;
int[] A_sort = new int[n];
System.out.println(" :");
arrayPrint(A);
System.out.println(" :");
mSort(A,A_sort,0, n-1);
// System.out.println(A);
arrayPrint(A_sort);
System.out.println(" ");
Arrays.sort(A);
arrayPrint(A);
}
/**
*
* @MethodName : arrayPrint
* @Description:
* @date : 2016-7-6 , 4:51:43
* @param : @param A
* @Version : v1.0
*/
public static void arrayPrint(int[] A) {
System.out.print("[ ");
for (int i = 0; i < A.length; i++) {
System.out.print(A[i] + " ");
}
System.out.println("]");
System.out.println();
}
単純な並べ替えアルゴリズム発泡アルゴリズム
/**
*
* @MethodName : bubbleSort0
* @Description:
* @date : 2016 7 19 , 10:10:53
* @param : @param A
* @Version : vx.x
*/
public static void bubbleSort0(int[] A){
for(int i=0;i < A.length-1;i++){
for(int j=i+1;jif(A[i] > A[j]){
swap(A,i,j);
}
}
}
}
最適化版発泡体の並べ替え/**
*
* @MethodName : buubleSort1
* @Description:
* @date : 2016 7 19 , 10:57:17
* @param : @param A
* @Version : vx.x
*/
public static void bubbleSort1(int[] A){
for(int i = 0;ifor(int j=A.length-1;j>i;j--){ //j
if(A[j-1] > A[j]){ //
swap(A,j-1,j);
}
}
}
}
泡並べ替えのさらなる最適化上記の最適化泡並べ替えアルゴリズムの問題は、データが途中で並べ替えられたら、後続の比較作業が継続され、時間の無駄が生じることである.さらに最適化することは、フラグを追加することです.比較を続ける必要がありますか?
/**
*
* @MethodName : bubbleSort2
* @Description:
* @date : 2016 7 19 , 11:26:36
* @param : @param A
* @Version : vx.x
*/
public static void bubbleSort2(int [] A){
boolean flag = true;
for(int i=0; ifalse;
for(int j=A.length-1;j>i;j--){
if(A[j-1] > A[j]){
swap(A,j-1,j);
flag = true;
}
}
}
}
泡並べ替えの複雑度分析クラスの並べ替えを選択
並べ替えを簡単に選択
n-i
回のキーワード間の比較により、n−i+1個のレコードからキーワードの最小の記録を選出し、i番目(1<=i<=n)のレコードと交換する./**
*
* @MethodName : selectSort
* @Description:
* @date : 2016 7 19 , 11:48:40
* @param : @param A
* @Version : vx.x
*/
public static void selectSort(int[] A){
for(int i=0;i1;i++){
int min = i;
for(int j=i+1;jif(A[min] > A[j]){
min = j;
}
}
if(i != min){
swap(A,i,min);
}
}
}
単純選択並べ替えの複雑さ分析並べ替えアルゴリズムを直接挿入
/**
*
* @MethodName : insertSort
* @Description:
* @date : 2016 7 19 , 3:05:31
* @param : @param A
* @Version : vx.x
*/
public static void insertSort(int[] A){
for(int i=1;i// 1 : A[0] , 。
if(A[i] < A[i-1]){ // A[i]
int tmp = A[i];// A[i]
int j;
for(j=i-1; j>=0 && A[j] > tmp; j--){ // A[i], j-- , A[j+1]
A[j+1] = A[j];
}
A[j+1] = tmp;
}
}
}
並べ替えの複雑さの分析を直接挿入します.クラスの並べ替えを挿入
ヒルの並べ替えアルゴリズム
/**
*
* @MethodName : shellSort
* @Description:
* @date : 2016 7 19 , 4:06:41
* @param : @param A
* @Version : vx.x
*/
public static void shellSort(int[] A){
int inc = A.length; // inc inc
//
do{
inc = inc/4 + 1;
for(int i=inc;iif(A[i] < A[i-inc]){
int tmp = A[i];
int j=0;
for(j=i-inc;j>=0 && tmp < A[j]; j-=inc){
A[j+inc] = A[j];
}
A[j+inc] = tmp;
}
}
}
while(inc>1);
}
ヒルの並べ替えの複雑さの分析積み上げ順序
フォーマットの
に従って配列を並べ替える.
を
と位置を交換する./**
*
* @MethodName : heapSort
* @Description:
* @date : 2016 7 19 , 5:29:24
* @param : @param A
* @param : @param n
* @Version : vx.x
*/
public static void heapSort(int[] A,int n){
for(int i=(n-1)/2 ;i>=0;i--){
// (A[(n-1)/2]) , , , 。
// 0 0, 。
heapAdjust(A,i,n-1);
}
for(int i=n-1;i>0;i--){
// n-1 , A[0], A[i-1]
// 1 , A[0],A[1]
swap(A,0,i);
heapAdjust(A,0,i-1);
}
}
/**
*
* @MethodName : heapAdjust
* @Description:
* @date : 2016 7 19 , 5:37:06
* @param : @param A
* @param : @param s
* @param : @param m
* @Version : vx.x
*/
public static void heapAdjust(int[] A, int s, int m){
int tmp = A[s];
for(int j=2*s+1;j<=m;j=j*2+1){
if(j1]){ // , ; j
j++;
}
if(tmp > A[j]){ // A[s] , true , for
break;
}
else{ // , s j, ,
A[s] = A[j];
s=j;
}
}
A[s] = tmp;// , , 。
}
積み上げ順序の複雑さ分析/**
*
* @MethodName : mSort
* @Description:
* @date : 2016-7-6 , 4:27:19
* @param : @param sR :
* @param : @param tR1 :
* @param : @param s :
* @param : @param t :
* @Version : v1.0
*/
static void mSort(int[] sR,int[] tR1, int s , int t){
int m; //
int[] tR2 = new int[sR.length]; //
if(s==t){
tR1[s]=sR[s];
}
else {
m=(s+t)/2; // sR[s..t] sR[s..m] sR[m+1..t]
mSort(sR, tR2, s, m); // sR[s..m] tR2[s..m]
mSort(sR, tR2, m+1, t); // sR[m+1,t] tR2[m+1..t]
merge(tR2,tR1,s,m,t); // tR2[s..m] tR2[m+1,t] tR1[s..t]
}
}
/**
*
* @MethodName : merge
* @Description:
* @date : 2016-7-6 , 4:40:33
* @param : @param sR :
* @param : @param tR :
* @param : @param i :
* @param : @param m :
* @param : @param n :
* @Version : vx.x
*/
static void merge(int sR[],int tR[] ,int i ,int m ,int n){
int j,k,l;
for(j=m+1,k=i;i<=m && j<=n;k++){
if(sR[i] < sR[j]){
tR[k] = sR[i++];
}else {
tR[k] = sR[j++];
}
}
if(i<=m){
for(l=0;l<=m-i;l++){
tR[k+l]=sR[i+l];
}
}
if(j<=n){
for(l=0;l<=n-j;l++){
tR[k+l]=sR[j+l];
}
}
}
再帰的でない方法で正規化と並べ替えを実現する/**
*
* @MethodName : mergeSort
* @Description:
* @param : @param sR
* @date : 2016-7-6 , 9:15:30
* @Version : v1.0
*/
static int[] mergeSort(int[] sR){
int m; //
int[] tR = new int[sR.length]; //
int k=1; //
while(k < sR.length){
MergePass(sR,tR,k,sR.length-1);
k=k*2;
MergePass(tR,sR,k,sR.length-1);
k=k*2;
}
return sR;
}
/**
*
* @MethodName : MergePass
* @Description: sR s tR
* @date : 2016-7-6 , 9:20:15
* @param : @param sR :
* @param : @param tR :
* @param : @param s :
* @param : @param n :
* @Version : v1.0
*/
static void MergePass(int sR[] , int tR[], int s , int n){
int i = 0;
while(i <= n-2*s+1){ // 2s :
merge(sR, tR, i, i+s-1, i+2*s-1);
i=i+2*s;
}
if(i1){// 2s
merge(sR, tR, i, i+s-1, n);
}
else{
for(int j=i;j<=n;j++){
tR[j] = sR[j];
}
}
}
/**
*
* @MethodName : merge
* @Description:
* @date : 2016-7-6 , 4:40:33
* @param : @param sR :
* @param : @param tR :
* @param : @param i :
* @param : @param m :
* @param : @param n :
* @Version : vx.x
*/
static void merge(int sR[],int tR[] ,int i ,int m ,int n){
int j,k,l;
for(j=m+1,k=i;i<=m && j<=n;k++){
if(sR[i] < sR[j]){
tR[k] = sR[i++];
}else {
tR[k] = sR[j++];
}
}
if(i<=m){
for(l=0;l<=m-i;l++){
tR[k+l]=sR[i+l];
}
}
if(j<=n){
for(l=0;l<=n-j;l++){
tR[k+l]=sR[j+l];
}
}
}
複雑度の分析を並べ替えます./**
*
* @MethodName : quickSort
* @Description:
* @date : 2016 7 18 , 7:19:20
* @param : @param A
* @return
* @Version : vx.x
*/
public static void quickSort(int[] A,int startIdx,int endIdx){
int pivot;
if(startIdx < endIdx){
pivot = partition(A,startIdx,endIdx); // , pivot
quickSort(A,startIdx,pivot-1); //
quickSort(A,pivot+1,endIdx); //
}
}
/**
*
* @MethodName : partition
* @Description:
* @date : 2016 7 18 , 11:18:15
* @param : @param A
* @param : @param startIdx
* @param : @param endIdx
* @param : @return
* @Version : vx.x
*/
public static int partition(int[] A,int startIdx,int endIdx){
int pivotkey;
pivotkey = A[startIdx]; //
while(startIdx < endIdx){
while(startIdx < endIdx && A[endIdx] >= pivotkey){ // pivotkey=A[startIdx]
endIdx--;
}
swap(A,startIdx,endIdx);
//pivotkey = A[endIdx]
while(startIdx < endIdx && A[startIdx] <= pivotkey){
startIdx++;
}
swap(A,startIdx,endIdx); //pivotkey=A[startIdx]
}
return startIdx;
}
/**
*
* @MethodName : swap
* @Description: a,b
* @date : 2016 7 18 , 11:37:53
* @param : @param A
* @param : @param a
* @param : @param b
* @Version : vx.x
*/
static void swap(int[] A , int a, int b){
int temp = A[a];
A[a] = A[b];
A[b] = temp;
}
高速ソート時間の複雑度分析