Java實現各種排序匯總
選擇排序、快速排序、希爾排序、堆排序不是穩定的排序算法,
冒泡排序、插入排序、歸并排序和基數排序是穩定的排序算法。
</h4>
那什么是穩定的排序算法呢?
就是在排序的過程中,相等的兩個數并不會在排列后中為位置發生次序發生顛倒
再看一下各排列算法的時間效率分析匯總:
|
排序法 |
平均時間 |
最差情形 |
穩定度 |
額外空間 |
備注 |
|
冒泡 |
O(n2) |
O(n2) |
穩定 |
O(1) |
n小時較好 |
|
選擇 |
O(n2) |
O(n2) |
不穩定 |
O(1) |
n小時較好 |
|
插入 |
O(n2) |
O(n2) |
穩定 |
O(1) |
大部分已排序時較好 |
|
基數 |
O(logRB) |
O(logRB) |
穩定 |
O(n) |
B是真數(0-9), R是基數(個十百) |
|
希爾 |
O(nlogn) |
O(ns) 1<s<2 |
不穩定 |
O(1) |
s是所選分組 |
|
快速 |
O(nlogn) |
O(n2) |
不穩定 |
O(nlogn) |
n大時較好 |
|
歸并 |
O(nlogn) |
O(nlogn) |
穩定 |
O(1) |
n大時較好 |
|
堆 |
O(nlogn) |
O(nlogn) |
不穩定 |
O(1) |
n大時較好 |
一、冒泡排序
/**
* 冒泡排序
*
* @author 陳雪桂
*
*/
public class BubbleSort
{
public static void main(String[] args)
{
BubbleSort b = new BubbleSort();
int[] a = b.init(args);
a = b.bubbleSort(a);
System.out.print("排序結果: ");
b.print(a);
}
/**
* 初始化數組
*
* @param args
* @return
*/
private int[] init(String args[])
{
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
{
a[i] = Integer.valueOf(args[i]);
}
return a;
}
/**
* 排序核心部分
*
* @param a
* @return
*/
private int[] bubbleSort(int[] a)
{
int temp;
for (int i = 0; i < a.length; i++)
for (int j = 0; j < a.length - i - 1; j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
return a;
}
/**
* 打印
* @param a
*/
private void print(int[] a)
{
for (int i = 0; i < a.length; i++)
{
System.out.print(a[i] + " ");
}
}
} 二、選擇排序
/**
* 選擇排序
*
* @author 陳雪桂
*
*/
public class SelectionSort
{
public static void main(String[] args)
{
SelectionSort s = new SelectionSort();
int[] a = s.init(args);
a = s.selectionSort(a);
System.out.print("排序結果: ");
s.print(a);
}
/**
* 初始化數組
*
* @param args
* @return
*/
private int[] init(String args[])
{
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
{
a[i] = Integer.valueOf(args[i]);
}
return a;
}
/**
* 選擇排序核心
*
* @param a
* @return
*/
private int[] selectionSort(int[] a)
{
int min;
int temp;
for (int i = 0; i < a.length; i++)
{
min = i;
for (int j = i + 1; j < a.length; j++)
{
if (a[j] < a[min])
{
min = j;
}
}
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
return a;
}
/**
* 打印
*
* @param a
*/
private void print(int[] a)
{
for (int i = 0; i < a.length; i++)
{
System.out.print(a[i] + " ");
}
}
} 三、插入排序
/**
* 插入排序
*
* @author Administrator
*
*/
public class InsertSort
{
public static void main(String[] args)
{
InsertSort insertSort = new InsertSort();
int[] a = insertSort.init(args);
a = insertSort.insertSort(a);
System.out.print("排列順序: ");
insertSort.print(a);
}
// 初始劃排列數組
private int[] init(String[] args)
{
int[] j = new int[args.length];
for (int i = 0; i < args.length; i++)
{
j[i] = Integer.valueOf(args[i]);
}
return j;
}
// 增序排列
private int[] insertSort(int[] a)
{
int temp;
for (int i = 1; i < a.length; i++)
{
temp = a[i];
int j = i - 1;
for (; j >= 0 && a[j] > temp; j--)
{
a[j + 1] = a[j];
}
a[j + 1] = temp;
}
return a;
}
private void print(int[] a)
{
for (int i = 0; i < a.length; i++)
{
System.out.print(a[i] + " ");
}
}
} 四、基數排序
/**
* 基數排序 平均時間復雜度:O(dn)(d即表示整形的最高位數)
* 空間復雜度:O(10n) (10表示0~9,用于存儲臨時的序列)
* 穩定性:穩定
*
* @author 陳雪桂
*
*/
public class RadixSort
{
/**
* 最大數的位數
*/
static int max_Pos = 2;
public static void main(String[] args)
{
RadixSort r = new RadixSort();
int[] a = r.init(args);
a = r.radixSort(a, a.length);
System.out.print("排列結果: ");
r.print(a);
}
/**
* 初始化數組
*
* @param args
* @return
*/
private int[] init(String args[])
{
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
{
a[i] = Integer.valueOf(args[i]);
}
return a;
}
private int[] radixSort(int[] data, int dataSize)
{
List<Integer>[] bucket = new ArrayList[10];
for (int pos = 1; pos <= max_Pos; pos++)
{
for (int i = 0; i < dataSize; i++)
{
int num = getNumAtPos(data[i], pos - 1);
if (null == bucket[num])
{
bucket[num] = new ArrayList<Integer>();
}
bucket[num].add(data[i]);
}
for (int i = 0, j = 0; i < 10; i++)
{
for (int k = 0; bucket[i] != null && k < bucket[i].size(); k++)
{
data[j++] = bucket[i].get(k);
}
if (bucket[i] != null)
{
bucket[i].clear();
}
}
}
return data;
}
/**
* 獲取當前位上數字
*
* @param num
* @param pos
* @return
*/
private int getNumAtPos(int num, int pos)
{
int temp = 1;
for (int i = 0; i < pos; i++)
{
temp *= 10;
}
return (num / temp) % 10;
}
private void print(int[] a)
{
for (int i = 0; i < a.length; i++)
{
System.out.print(a[i] + " ");
}
}
} 五、希爾排序
/**
* 希爾排序
*
* @author 陳雪桂
*
*/
public class ShellSort
{
public static void main(String[] args)
{
ShellSort s = new ShellSort();
int[] a = s.init(args);
a = s.shellSort(a);
System.out.print("排列順序 : ");
s.print(a);
}
/**
* 初始化數組
*
* @param args
* @return
*/
private int[] init(String args[])
{
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
{
a[i] = Integer.valueOf(args[i]);
}
return a;
}
/**
* 希爾排序核心1
*
* @param args
* @return
*/
private int[] shellSort(int[] a)
{
for (int step = a.length / 2; step >= 1; step = step/2)
{
a = shellInsert(a, step);
}
return a;
}
/**
* 增序排列
*
* @param a
* @param step
* @return
*/
private int[] shellInsert(int[] a, int step)
{
int min = 0;
for (int i = step; i < a.length; i++)
{
if (a[i] < a[i - step])
{
min = a[i];
int j;
for (j = i - step; j >= 0 && a[j] > min; j -= step)
{
a[j + step] = a[j];
}
a[j + step] = min;
}
}
return a;
}
/**
* 打印
*
* @param a
*/
private void print(int[] a)
{
for (int i = 0; i < a.length; i++)
{
System.out.print(a[i] + " ");
}
}
} 六、快速排序
/**
* 快速排序
*
* @author 陳雪桂
*
*/
public class QuickSort
{
static int count = 0;
public static void main(String[] args)
{
QuickSort q = new QuickSort();
int[] list = new int[12];
for (int i = 0; i < args.length; i++)
{
list[i] = Integer.valueOf(args[i]);
}
q.quickSort(list, 0, list.length - 1);
System.out.print("排序順序: ");
for (int i = 0; i < list.length; i++)
{
System.out.print(list[i] + " ");
}
System.out.println("\n執行次數:" +count );
}
public void quickSort(int[] n, int from, int to)
{
if (from <= to)
{
int midSort = partition(n, from, to);
quickSort(n, from, midSort - 1);
quickSort(n, midSort + 1, to);
}
return;
}
public int partition(int[] n, int from, int to)
{
int i = from + 1;
int j = to;
int p = n[from];
while (i < j)
{
while (n[i] < p)
i++;
while (n[j] > p)
j--;
swap(n, i, j);
count ++;
}
// 判斷是否有必要撤銷最后一次交換,必要則不用在循環中加入邊界檢查條件
if(i != from+1 || j !=to)swap(n, i, j);
swap(n,from,j);
return j;
}
public void swap(int[] n, int i, int j)
{
int temp = n[i];
n[i] = n[j];
n[j] = temp;
}
} 七、合并排序
/**
* 合并排序
* @author 陳雪桂
*
*/
public class MergeSort
{
public static void main(String[] args)
{
int[] list = new int[12];
for (int i = 0; i < args.length; i++)
{
list[i] = Integer.valueOf(args[i]);
}
list = new MergeSort().mergeSort(list, 0, list.length-1);
System.out.print("排列順序: ");
for (int i = 0; i < list.length; i++)
{
System.out.print(list[i] + " ");
}
}
public int[] mergeSort(int[] list, int from, int to)
{
if (from != to)
{
int mid = (from + to) / 2;
mergeSort(list, from, mid);
mergeSort(list, mid + 1, to);
return merge(list, from, to);
}
return list;
}
public int[] merge(int[] list, int from, int to)
{
int i = from;
int mid = (from + to) / 2;
int j = mid + 1;
int[] a = new int[to - from + 1];
int count = 0;
while (i <= mid && j <= to)
{
if (list[i] < list[j])
{
a[count++] = list[i++];
}
else
{
a[count++] = list[j++];
}
}
// 把剩余部分都加進去
while (i <= mid)
{
a[count++] = list[i++];
}
while (j <= to)
{
a[count++] = list[j++];
}
for(int k=from; k<= to; k++)
{
list[k] = a[k-from];
}
return list;
}
} 八、堆排序
/**
* 堆排序包括兩個步驟 (1)初始堆(堆的定義:(1)堆是一個完全二叉樹(2)根結點的值或者大于左右子樹的值或者小于左右子樹的值(3)左右子樹也是一個堆)
* (2)調整堆(當初始小頂堆之后,堆頂元素是最小的元素,取出最小的元素與最后一個元素相交換,再把剩下n-1個元素調整成堆,依次調整直到1為止)
* 非終端節點調整 初始堆時從n/2向上調整成堆 把第一個元素與最后一個元素交換之后從第1個元素開始調整成新堆
*
*
* 時間復雜度為O(nlogn) 輔助空間為O(1)
*
* @author 陳雪桂
*
*/
public class HeapSort
{
public static void main(String[] args)
{
HeapSort h = new HeapSort();
int[] a = init(args);
heapSort(a);
System.out.print("排列順序: ");
print(a);
}
/**
* 初始化數組
*
* @param args
* @return
*/
private static int[] init(String[] args)
{
int[] a = new int[args.length];
for (int i = 0; i < args.length; i++)
{
a[i] = Integer.valueOf(args[i]);
}
return a;
}
/**
* 堆排序核心部分
*
* @param num
*/
private static void heapSort(int[] num)
{
int temp;
// 初始建堆從n/2開始向根調整
for (int i = num.length / 2 - 1; i >= 0; i--)
{
adjustHeap(num, i, num.length);// 初始堆過程
}
for (int i = num.length - 1; i > 0; i--)
{
// 將堆頂元素與i元素交換
temp = num[i];
num[i] = num[0];
num[0] = temp;
// 從num[1]到num[i-1]調整成新堆
adjustHeap(num, 0, i - 1);
}
}
/**
* 調整堆
*
* @param num
* @param s
* 調整開始父節點
* @param t
* 調整結尾的界限
*/
private static void adjustHeap(int[] num, int s, int t)
{
int x = num[s];
// 從最下父節點 與子節點比較,一直向上進行調整
for (int j = 2 * s + 1; j <= t; j = 2 * j + 1)
{
// 找出較大者把較大者給num[i]
if (j < t && num[j] < num[j + 1])
{
j = j + 1;
}
if (j < t && x < num[j])
{
num[s] = num[j];
s = j;
}
}
num[s] = x;
}
/**
* 打印
*
* @param a
*/
private static void print(int[] a)
{
for (int i = 0; i < a.length; i++)
{
System.out.print(a[i] + " ");
}
}
} 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!