package interview;
import java.util.Arrays;
/**
* @author Administrator
* 桶式排序
*/
public class BucketSort {
public static void bucketSort(DataWrap[] data, int min, int max) {
System.out.println("開始排序");
int arrayLength = data.length;
DataWrap[] temp = new DataWrap[arrayLength];
int[] buckets = new int[max - min];
for (int i = 0; i < arrayLength; i++) {
buckets[data[i].data - min]++;
}
System.out.println(Arrays.toString(buckets));
for (int i = 1; i < max - min; i++) {
buckets[i] = buckets[i] + buckets[i - 1];
}
System.out.println(Arrays.toString(buckets));
System.arraycopy(data, 0, temp, 0, arrayLength);
for (int k = arrayLength - 1; k >= 0; k--) {
data[--buckets[temp[k].data - min]] = temp[k];
}
}
public static void main(String[] args) {
DataWrap[] data = { new DataWrap(9, ""), new DataWrap(5, ""),
new DataWrap(⑴, ""), new DataWrap(8, ""),
new DataWrap(5, "*"), new DataWrap(7, ""),
new DataWrap(3, ""), new DataWrap(⑶, ""),
new DataWrap(1, ""),new DataWrap(3, "*")};
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
bucketSort(data, ⑶, 10);
System.out.println("排序以后:\n" + java.util.Arrays.toString(data));
}
}
<span style="font-size:18px;">package interview;
/**
* @author Administrator
* 堆排序
*/
public class HeapSort {
public static void heapSort(DataWrap[] data) {
System.out.println("開始排序");
int arrayLength = data.length;
// 循環(huán)建堆
for (int i = 0; i < arrayLength - 1; i++) {
// 建堆
builMaxdHeap(data, arrayLength - 1 - i);
// 交換堆頂和最后1個(gè)元素
swap(data, 0, arrayLength - 1 - i);
System.out.println(java.util.Arrays.toString(data));
}
}
// 對(duì)data數(shù)組從0到lastIndex建大頂堆
private static void builMaxdHeap(DataWrap[] data, int lastIndex) {
// 從lastIndex處節(jié)點(diǎn)(最后1個(gè)節(jié)點(diǎn))的父節(jié)點(diǎn)開始
for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
// k保存當(dāng)前正在判斷的節(jié)點(diǎn)
int k = i;
// 如果當(dāng)前k節(jié)點(diǎn)的子節(jié)點(diǎn)存在
while (k * 2 + 1 <= lastIndex) {
// k節(jié)點(diǎn)的左子節(jié)點(diǎn)的索引
int biggerIndex = 2 * k + 1;
// 如果biggerIndex小于lastIndex,即biggerIndex +1
// 代表k節(jié)點(diǎn)的右子節(jié)點(diǎn)存在
if (biggerIndex < lastIndex) {
// 如果右子節(jié)點(diǎn)的值較大
if (data[biggerIndex].compareTo(data[biggerIndex + 1]) < 0) {
// biggerIndex總是記錄較大子節(jié)點(diǎn)的索引
biggerIndex++;
}
}
// 如果k節(jié)點(diǎn)的值小于其較大子節(jié)點(diǎn)的值
if (data[k].compareTo(data[biggerIndex]) < 0) {
// 交換它們
swap(data, k, biggerIndex);
// 將biggerIndex賦給k,開始while循環(huán)的下1次循環(huán)
// 重新保證k節(jié)點(diǎn)的值大于其左、右節(jié)點(diǎn)的值
k = biggerIndex;
} else {
break;
}
}
}
}
// 交換data數(shù)組中i、j兩個(gè)索引處的元素
private static void swap(DataWrap[] data, int i, int j) {
DataWrap temp = data[i];
data[i] = data[j];
data[j] = temp;
}
public static void main(String[] args) {
DataWrap[] data = { new DataWrap(9, ""), new DataWrap(⑴6, ""),
new DataWrap(21, "*"), new DataWrap(23, ""),
new DataWrap(⑶0, ""), new DataWrap(⑷9, ""),
new DataWrap(21, ""), new DataWrap(30, "*"),
new DataWrap(30, "")};
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
heapSort(data);
System.out.println("排序以后:\n" + java.util.Arrays.toString(data));
}
}
直接插入排序
package interview;
* @author Administrator
* 直接插入排序
*/
public class InsertSort {
public static void insertSort(DataWrap[] data){
System.out.println("開始排序");
int arrayLength = data.length;
for(int i = 1;i < arrayLength;i++){
DataWrap temp = data[i];
if(data[i].compareTo(data[i⑴]) < 0){
int j = i ⑴;
for(;j >= 0 && data[j].compareTo(temp) > 0;j--){
data[j +1] = data[j];
}
data[j + 1] = temp;
}
System.out.println(java.util.Arrays.toString(data));
}
}
public static void main(String[] args) {
DataWrap[] data = { new DataWrap(9, ""), new DataWrap(⑴6, ""),
new DataWrap(21, "*"), new DataWrap(23, ""),
new DataWrap(⑶0, ""), new DataWrap(⑷9, ""),
new DataWrap(21, ""), new DataWrap(30, "*"),
new DataWrap(30, "")};
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
insertSort(data);
System.out.println("排序以后:\n" + java.util.Arrays.toString(data));
}
}
歸并排序
算法的時(shí)間效力:歸并算法需要遞歸地進(jìn)行分解、合并,每進(jìn)行1趟歸并排序,需要merge()方法1次,每次履行
merge()需要比較n次,較差,需要1個(gè)與原始序列一樣大小的輔助序列。算法的穩(wěn)定性:穩(wěn)定
代碼:
package interview;
/**
* @author Administrator
* 歸并排序
*/
public class MergeSort {
public static void mergeSort(DataWrap[] data) {
// 歸并排序
sort(data, 0, data.length - 1);
}
// 將索引從left到right范圍的數(shù)組元素進(jìn)行歸并排序
private static void sort(DataWrap[] data, int left, int right) {
if(left < right){
//找出中間索引
int center = (left + right)/2;
sort(data,left,center);
sort(data,center+1,right);
//合并
merge(data,left,center,right);
}
}
// 將兩個(gè)數(shù)組進(jìn)行歸并,歸并前兩個(gè)數(shù)組已有序,歸并后仍然有序
private static void merge(DataWrap[] data, int left, int center, int right) {
DataWrap[] tempArr = new DataWrap[data.length];
int mid = center + 1;
int third = left;
int temp = left;
while (left <= center && mid <= right) {
if (data[left].compareTo(data[mid]) <= 0) {
tempArr[third++] = data[left++];
} else {
tempArr[third++] = data[mid++];
}
}
while (mid <= right) {
tempArr[third++] = data[mid++];
}
while (left <= center) {
tempArr[third++] = data[left++];
}
while (temp <= right) {
data[temp] = tempArr[temp++];
}
}
public static void main(String[] args) {
DataWrap[] data = { new DataWrap(9, ""), new DataWrap(⑴6, ""),
new DataWrap(21, "*"), new DataWrap(23, ""),
new DataWrap(⑶0, ""), new DataWrap(⑷9, ""),
new DataWrap(21, ""), new DataWrap(30, "*"),
new DataWrap(30, "") };
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
mergeSort(data);
System.out.println("排序以后:\n" + java.util.Arrays.toString(data));
}
}
基數(shù)排序
基數(shù)排序已不再是1種常規(guī)的排序方法,它更多地像是1種排序方法的利用,基數(shù)排序必須依賴于另外的排序方法。
基數(shù)排序的整體思路就是將待排數(shù)據(jù)拆分成多個(gè)關(guān)鍵字進(jìn)行排序,也就是說,基數(shù)排序的實(shí)質(zhì)是多關(guān)鍵字排序。
多關(guān)鍵字排序的思路是將待排數(shù)據(jù)里的排序關(guān)鍵字拆分成多個(gè)排序關(guān)鍵字:第1個(gè)子關(guān)鍵字、第2個(gè)子關(guān)鍵字、第3個(gè)子
關(guān)鍵字。。。然后,根據(jù)子關(guān)鍵字對(duì)待排數(shù)據(jù)進(jìn)行排序。在進(jìn)行多關(guān)鍵字排序時(shí)有兩種解決方案:
最高位優(yōu)先法MSD
最低位優(yōu)先法LSD
比較MSD法和LSD法,1般來說,LSD法要比MSD法來得簡單,由于LSD法是從頭到尾進(jìn)行若干次分配和搜集,履行
的次數(shù)取決于構(gòu)成關(guān)鍵字值的成份為多少;而MSD法則要處理各序列與子序列的獨(dú)立排序問題,便可能復(fù)雜1些。
代碼:
package interview;
import java.util.Arrays;
/**
* @author Administrator
* 基數(shù)排序
*/
public class MultiKeyRadixSort {
public static void radixSort(int[] data, int radix, int d) {
System.out.println("開始排序:");
int arrayLength = data.length;
int[] temp = new int[arrayLength];
int[] buckets = new int[radix];
for (int i = 0, rate = 1; i < d; i++) {
// 重置count數(shù)組,開始統(tǒng)計(jì)第2個(gè)關(guān)鍵字
Arrays.fill(buckets, 0);
// 當(dāng)data數(shù)組的元素復(fù)制到temp數(shù)組中進(jìn)行緩存
System.arraycopy(data, 0, temp, 0, arrayLength);
for (int j = 0; j < arrayLength; j++) {
int subKey = (temp[j] / rate) % radix;
buckets[subKey]++;
}
for (int j = 1; j < radix; j++) {
buckets[j] = buckets[j] + buckets[j - 1];
}
for (int m = arrayLength - 1; m >= 0; m--) {
int subKey = (temp[m] / rate) % radix;
data[--buckets[subKey]] = temp[m];
}
System.out.println("對(duì)" + rate + "位上子關(guān)鍵字排序:"
+ java.util.Arrays.toString(data));
rate *= radix;
}
}
public static void main(String[] args) {
int[] data = { 1100, 192, 221, 12, 13 };
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
radixSort(data, 10, 4);
System.out.println("排序以后:\n" + java.util.Arrays.toString(data));
}
}
快速排序
代碼:
package interview;
/**
* @author Administrator
* 快速排序
*/
public class QuickSort {
private static void swap(DataWrap[] data, int i, int j) {
DataWrap temp = data[i];
data[i] = data[j];
data[j] = temp;
}
private static void subSort(DataWrap[] data, int start, int end) {
if (start < end) {
DataWrap base = data[start];
int i = start;
int j = end + 1;
while (true) {
while (i < end && data[++i].compareTo(base) <= 0)
;
while (j > start && data[--j].compareTo(base) >= 0)
;
if (i < j) {
swap(data, i, j);
} else {
break;
}
}
swap(data, start, j);
subSort(data, start, j - 1);
subSort(data, j + 1, end);
}
}
public static void quickSort(DataWrap[] data){
subSort(data,0,data.length⑴);
}
public static void main(String[] args) {
DataWrap[] data = { new DataWrap(9, ""), new DataWrap(⑴6, ""),
new DataWrap(21, "*"), new DataWrap(23, ""),
new DataWrap(⑶0, ""), new DataWrap(⑷9, ""),
new DataWrap(21, ""), new DataWrap(30, "*"),
new DataWrap(30, "") };
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
quickSort(data);
System.out.println("排序以后:\n" + java.util.Arrays.toString(data));
}
}
直接選擇排序
代碼:
package interview;
/**
* @author Administrator
* 直接選擇排序
*/
public class SelectSort {
public static void selectSort(DataWrap[] data) {
System.out.println("開始排序");
int arrayLength = data.length;
for (int i = 0; i < arrayLength - 1; i++) {
for (int j = i + 1; j < arrayLength; j++) {
if (data[i].compareTo(data[j]) > 0) {
DataWrap temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
System.out.println(java.util.Arrays.toString(data));
}
}
public static void main(String[] args) {
DataWrap[] data = { new DataWrap(9, ""), new DataWrap(⑴6, ""),
new DataWrap(21, "*"), new DataWrap(23, ""),
new DataWrap(⑶0, ""), new DataWrap(⑷9, ""),
new DataWrap(21, ""), new DataWrap(30, "*"),
new DataWrap(30, "") };
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
selectSort(data);
System.out.println("排序以后:\n" + java.util.Arrays.toString(data));
}
}
希爾排序
代碼:
package interview;
/**
* @author Administrator
* Shell排序
*/
public class ShellSort {
public static void ShellSort(DataWrap[] data) {
System.out.println("開始排序");
int arrayLength = data.length;
int h = 1;
/**
* 將數(shù)組分割成若干個(gè)子序列
*/
while (h <= arrayLength / 3) {
h = h * 3 + 1;
System.out.println("h的結(jié)果:" + h);
}
while (h > 0) {
System.out.println("===h的值:" + h + "===");
/**
* 將分成的若干子序列進(jìn)行直接插入排序
*/
for (int i = h; i < arrayLength; i++) {
DataWrap temp = data[i];
if (data[i].compareTo(data[i - h]) < 0) {
int j = i - h;
for (; j >= 0 && data[j].compareTo(temp) > 0; j -= h) {
data[j + h] = data[j];
}
data[j + h] = temp;
}
System.out.println(java.util.Arrays.toString(data));
}
h = (h - 1) / 3;
}
}
public static void main(String[] args) {
DataWrap[] data = {
new DataWrap(9, ""), new DataWrap(⑴6, ""),
new DataWrap(21, "*"), new DataWrap(23, ""),
new DataWrap(⑶0, ""), new DataWrap(⑷9, ""),
new DataWrap(21, ""), new DataWrap(30, "*"),
new DataWrap(30, "")};
System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
ShellSort(data);
System.out.println("排序以后:\n" + java.util.Arrays.toString(data));
}
}
所需要的工具類
package interview;
//定義1個(gè)數(shù)據(jù)包裝類
class DataWrap implements Comparable<DataWrap>{
int data;
String flag;
public DataWrap(int data, String flag) {
this.data = data;
this.flag = flag;
}
public String toString(){
return data + flag;
}
@Override
public int compareTo(DataWrap dw) {
return this.data > dw.data ?
1 : (this.data == dw.data ? 0 : ⑴);
}
}