1.冒泡排序
package 排序;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {2,7,4,3,5,8,6,1,9,0};
sort(arr);
System.out.println(Arrays.toString(arr));
}
//冒泡排序
public static void sort(int[] arr) {
for(int j=0;j<arr.length;j++) {
for(int i=0;i<arr.length-1;i++) {
if(arr[i]>arr[i+1]) {
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
}
}
}
2.堆排序
package 排序;
import java.util.Arrays;
public class HeapSort {
public static void main(String[] args) {
int[] arr = {5,7,4,2,0,3,-3,1,-2,9,6,10,8,-1};
//第一大步 大顶堆构造完成
for(int p = arr.length-1;p>=0;p--) {
adjust(arr,p,arr.length);
}
//第二大步 交换堆顶和堆底值,去掉堆底值,剩余继续构造大顶堆
for(int i = arr.length-1;i>=0;i--) {
int temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
adjust(arr,0,i);
}
System.out.println(Arrays.toString(arr));
}
//维护
public static void adjust(int[] arr,int parent,int length) {
int child = 2*parent+1;
while(child<length) {
//定义右孩子
int rchild = child+1;
if(rchild<length&&arr[rchild]>arr[child]) {
child++;
}
//parent和child所指向的节点进行比较
if(arr[parent]<arr[child]){
//父子节点进行交换
int temp = arr[parent];
arr[parent] = arr[child];
arr[child] = temp;
//parent向下指,child指向其左右孩子最大值
parent = child;
child = child*2+1;
}
else {
//结束
break;
}
}
}
}
3.插入排序
package 排序;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = { 5, 7, 4, 2, 0, 3, -3, 1, -2, 9, 6, 10, 8, -1 };
sort(arr);
System.out.println(Arrays.toString(arr));
}
//插入排序
public static void sort(int[] arr) {
for(int i=1;i<arr.length;i++) {
for(int j=i-1;j>=0;j--) {
if(arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
else {
break;
}
}
}
}
}
4.快速排序
package 排序;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = { 5, 7, 4, 2, 0, 3, -3, 1, -2, 9, 6, 10, 8, -1 };
sort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr, int left, int right) {
// 递归出口
if (left >= right) {
return;
}
// 定义变量保存基本数
int base = arr[left];
// 定义i和j游标
int i = left;
int j = right;
while (i != j) {
// j从后往前找比基准数小的,找到后停下
while (arr[j] >= base && i < j) {
j--;
}
// i游标从前往后找比基准数大的,找到后停下
while (arr[i] <= base && i < j) {
i++;
}
// i和j进行交换
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// i和j相遇,基准数和相遇位置数据进行交换
arr[left] = arr[i];
arr[i] = base;
// 拆分左边
sort(arr, left, i - 1);
// 拆分右边
sort(arr, i + 1, right);
}
}
5.选择排序
package 排序;
import java.util.Arrays;
public class SelectSort {
public static void main(String[] args) {
int[] arr = { 5, 7, 4, 2, 0, 3, -3, 1, -2, 9, 6, 10, 8, -1 };
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr) {
for(int j = 0;j<arr.length;j++) {
int min = arr[j];//记录最小值
int minIndex = j;//记录最小值下标
for(int i=j+1;i<arr.length;i++) {
if(arr[i]<min) {
min=arr[i];
minIndex=i;
}
}
//最小值和待排序数组的第一个数进行交换
arr[minIndex] = arr[j];
arr[j] = min;
}
}
}
6.希尔排序
package 排序;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] arr = { 5, 7, 4, 2, 0, 3, -3, 1, -2, 9, 6, 10, 8, -1 };
sort(arr);
System.out.println(Arrays.toString(arr));
}
//希尔排序
public static void sort(int[] arr) {
for(int grp = arr.length/2;grp>=1;grp/=2) {
for(int i = grp;i<arr.length;i++) {
for(int j=i-grp;j>=0;j-=grp) {
if(arr[j+grp]<arr[j]) {
int temp = arr[j];
arr[j] = arr[j+grp];
arr[j+grp] = temp;
}
else {
break;
}
}
}
}
}
}
7.基数排序
package 排序;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] arr = { 4202, 2355, 13, 54, 84, 9, 234, 121, 32, 0 };
sort(arr);
System.out.println(Arrays.toString(arr));
}
// 基数排序
public static void sort(int[] arr) {
// 找数组当中的最大值
int max = arr[0];
for (int j = 0; j < arr.length; j++) {
if (arr[j] > max) {
max = arr[j];
}
}
// 获取最大值的位数
int maxLength = (max + "").length();
// 定义桶
int[][] bucket = new int[10][arr.length];
// 定义桶记录工具
int[] bucketCounts = new int[10];
int n = 1;
for (int h = 0; h < maxLength; h++) {
// 将输入放入桶内
for (int i = 0; i < arr.length; i++) {
// 放到哪个桶
int element = arr[i] / n % 10;// 获取对应数位数值
// 读取桶记录工具,确定放到桶内哪个位置
int count = bucketCounts[element];
// 数据放入
bucket[element][count] = arr[i];
// 桶记录+1
bucketCounts[element]++;
}
// 数据取出
// 遍历数组
int index = 0;
// 遍历桶记录 (总共只有十个桶,所以k<10即可)
for (int k = 0; k < 10; k++) {
if (bucketCounts[k] != 0) {
for (int l = 0; l < bucketCounts[k]; l++) {
arr[index] = bucket[k][l];
index++;
}
}
bucketCounts[k] = 0;
}
n = n * 10;
}
}
}
8.归并排序
package 排序;
import java.util.Arrays;
public class MergeSort {
// 归并排序
public static void main(String[] args) {
int[] arr = { 5, 7, 4, 2, 0, 3, -3, 1, -2, 9, 6, 10, 8, -1 };
split(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
// 拆分
public static void split(int[] arr, int left, int right) {
if (left == right) {
return;
}
int i = (left + right) / 2;
// 向左递归
split(arr, left, i);
// 向右递归
split(arr, i + 1, right);
// 合并
merge(arr, left, i, right);
}
public static void merge(int[] arr, int left, int mid, int right) {
int s1 = left;
int s2 = mid + 1;
// 临时数据
int temp[] = new int[right - left + 1];
// 临时数组的下标
int index = 0;
//将数据在临时数组中排序
while (s1 <= mid && s2 <= right) {
if (arr[s1] < arr[s2]) {
temp[index] = arr[s1];
index++;
s1++;
} else {
temp[index] = arr[s2];
index++;
s2++;
}
}
// 判断s1当中是否还有数据
while (s1 <= mid) {
temp[index] = arr[s1];
index++;
s1++;
}
// 判断s2当中是否还有数据
while (s2 <= right) {
temp[index] = arr[s2];
index++;
s2++;
}
// 临时数组当中的数值放回原数组
for (int j = 0; j < temp.length; j++) {
arr[left + j] = temp[j];
}
}
}