# java实现的各种排序算法

## 折半插入排序

package interview;
/**
* 折半插入排序
*/
public class BinaryInsertSort {
public static void binaryInsertSort(DataWrap[] data) {
System.out.println("开始排序");
int arrayLength = data.length;
for (int i = 1; i < arrayLength; i++) {
DataWrap temp = data[i];
int low = 0;
int high = i – 1;
while (low <= high) {
int mid = (low + high) / 2;
if (temp.compareTo(data[mid]) > 0) {
low = mid + 1;
} else {
high = mid – 1;
}
}
for (int j = i; j > low; j–) {
data[j] = data[j – 1];
}
data[low] = 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));
binaryInsertSort(data);
System.out.println("排序以后：\n" + java.util.Arrays.toString(data));
}
}

## 冒泡排序

package interview;

/**
* 冒泡排序
*/
public class BubbleSort {
public static void bubbleSort(DataWrap[] data) {
System.out.println("开始排序");
int arrayLength = data.length;
for (int i = 0; i < arrayLength – 1; i++) {
boolean flag = false;
for (int j = 0; j < arrayLength – 1 – i; j++) {
if (data[j].compareTo(data[j + 1]) > 0) {
DataWrap temp = data[j + 1];
data[j + 1] = data[j];
data[j] = temp;
flag = true;
}
}
System.out.println(java.util.Arrays.toString(data));
if (!flag)
break;
}
}

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));
bubbleSort(data);
System.out.println("排序以后：\n" + java.util.Arrays.toString(data));
}
}

## 桶式排序

package interview;

import java.util.Arrays;

/**
* 桶式排序
*/
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;

/**
* 堆排序
*/
public class HeapSort {
public static void heapSort(DataWrap[] data) {
System.out.println("开始排序");
int arrayLength = data.length;
// 循环建堆
for (int i = 0; i < arrayLength – 1; i++) {
// 建堆
builMaxdHeap(data, arrayLength – 1 – i);
// 交换堆顶和最后1个元素
swap(data, 0, arrayLength – 1 – i);
System.out.println(java.util.Arrays.toString(data));
}
}

// 对data数组从0到lastIndex建大顶堆
private static void builMaxdHeap(DataWrap[] data, int lastIndex) {
// 从lastIndex处节点（最后1个节点）的父节点开始
for (int i = (lastIndex – 1) / 2; i >= 0; i–) {
// k保存当前正在判断的节点
int k = i;
// 如果当前k节点的子节点存在
while (k * 2 + 1 <= lastIndex) {
// k节点的左子节点的索引
int biggerIndex = 2 * k + 1;
// 如果biggerIndex小于lastIndex，即biggerIndex +1
// 代表k节点的右子节点存在
if (biggerIndex < lastIndex) {
// 如果右子节点的值较大
if (data[biggerIndex].compareTo(data[biggerIndex + 1]) < 0) {
// biggerIndex总是记录较大子节点的索引
biggerIndex++;
}
}
// 如果k节点的值小于其较大子节点的值
if (data[k].compareTo(data[biggerIndex]) < 0) {
// 交换它们
swap(data, k, biggerIndex);
// 将biggerIndex赋给k，开始while循环的下1次循环
// 重新保证k节点的值大于其左、右节点的值
k = biggerIndex;
} else {
break;
}
}
}
}

// 交换data数组中i、j两个索引处的元素
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;

* 直接插入排序
*/
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));
}
}

## 归并排序

merge()需要比较n次，较差，需要1个与原始序列一样大小的辅助序列。算法的稳定性：稳定

package interview;

/**
* 归并排序
*/
public class MergeSort {
public static void mergeSort(DataWrap[] data) {
// 归并排序
sort(data, 0, data.length – 1);
}

// 将索引从left到right范围的数组元素进行归并排序
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);
}
}

// 将两个数组进行归并，归并前两个数组已有序，归并后仍然有序
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));
}
}

## 基数排序

package interview;

import java.util.Arrays;

/**
* 基数排序
*/
System.out.println("开始排序：");
int arrayLength = data.length;
int[] temp = new int[arrayLength];
for (int i = 0, rate = 1; i < d; i++) {
// 重置count数组，开始统计第2个关键字
Arrays.fill(buckets, 0);
// 当data数组的元素复制到temp数组中进行缓存
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("对" + rate + "位上子关键字排序："
+ java.util.Arrays.toString(data));
}
}

public static void main(String[] args) {
int[] data = { 1100, 192, 221, 12, 13 };
System.out.println("排序之前：\n" + java.util.Arrays.toString(data));
System.out.println("排序以后：\n" + java.util.Arrays.toString(data));
}
}

## 快速排序

package interview;

/**
* 快速排序
*/
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;

/**
* 直接选择排序
*/
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;

/**
* Shell排序
*/
public class ShellSort {
public static void ShellSort(DataWrap[] data) {
System.out.println("开始排序");
int arrayLength = data.length;

int h = 1;
/**
* 将数组分割成若干个子序列
*/
while (h <= arrayLength / 3) {
h = h * 3 + 1;
System.out.println("h的结果：" + h);
}
while (h > 0) {
System.out.println("===h的值：" + h + "===");
/**
* 将分成的若干子序列进行直接插入排序
*/
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个数据包装类
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 : ⑴);
}

}

1. 本站所有资源来源于用户上传和网络，如有侵权请邮件联系站长！
2. 分享目的仅供大家学习和交流，您必须在下载后24小时内删除！
3. 不得使用于非法商业用途，不得违反国家法律。否则后果自负！
4. 本站提供的源码、模板、插件等等其他资源，都不包含技术服务请大家谅解！
5. 如有链接无法下载、失效或广告，请联系管理员处理！
6. 本站资源售价只是赞助，收取费用仅维持本站的日常运营所需！
7. 如遇到加密压缩包，请使用WINRAR解压,如遇到无法解压的请联系管理员！