简单选择排序:
public class EasySelectSort {
public static void main(String[] args) {
int arr[]={1,4,6,8,2,5,3,7,9};
System.out.println("数组排序前顺序:");
for (int n:arr){
System.out.print(n+" ");
}
//简单选择排序
selectSort(arr);
System.out.println("\n数组排序后顺序:");
for (int n :arr){
System.out.print(n+" ");
}
}
//简单选择排序
private static void selectSort(int[] arr){
int position = 0;//无序序列中的第一个位置
//外层循环确定有序区
for (int i=0;i
直接插入排序:
public class InsertSort {
public static void main(String[] args) {
int arr[] ={1,4,6,8,2,5,3,7,9};
System.out.println("数组排序前顺序:");
for (int n:arr){
System.out.print(n+"");
}
//直接插入排序
insertSort(arr);
System.out.println("\n数组排序后顺序:");
for (int n:arr){
System.out.print(n+" ");
}
}
//直接插入排序
public static void insertSort(int[] arr){
//外层循环确定待比较数值
for (int i=1;i=0&&arr[j]>temp;j--){ //待比较数值比前一位置小,应插往前插一位
//将大于temp的值整体后移一个单位
arr[j+1]=arr[j];
}
arr[j+1]=temp;//待比较数值比前一位置大,最终位置无误
}
}
}
堆排序:
public class HeapSort {
public static void main(String[] args) {
int arr[] = {1,4,6,8,2,5,3,7,9};
System.out.println("数组排序前顺序:");
for(int n : arr){
System.out.print(n+" ");
}
//堆排序
heapSort(arr);
System.out.println("\n数组排序后顺序:");
for(int n : arr){
System.out.print(n+" ");
}
}
//堆排序
private static void heapSort(int []arr){
//1.构建大根堆
for (int i=arr.length/2-1;i>=0;i--){//第一个非叶子结点下标i=arr.length/2-1
//从第一个非叶子结点从下至上,从右至左调整结构
adjustHeap(arr,i,arr.length);
}
//2.交换堆顶元素与末尾元素+调整堆结构
for (int j=arr.length-1;j>0;j--){//堆末尾元素的下标j=arr.length-1,不能为0,因为它不能是堆顶元素
//将堆顶元素与末尾元素进行交换
int temp=arr[0];
arr[0]=arr[j];
arr[j]=temp;
//重新对堆进行调整
adjustHeap(arr,0,j);
}
}
//调整大根堆(仅是调整过程,建立在大根堆已构建的基础上)
// arr: 要排序的序列(数组)
// i: 第一个非叶子结点下标
// n: 剩余序列的长度(需要调整的结点个数)
private static void adjustHeap(int []arr,int i,int n){
int temp = arr[i];//先取出第一个非叶子结点(根节点)
for(int k=i*2+1;k temp){//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)
arr[i] = arr[k];
i = k;
}else{
break;
}
}
arr[i] = temp;//将temp值放到最终的位置
}
}
希尔排序:
public class SheelSort {
public static void main(String[] args) {
int arr[]={1,4,6,8,2,5,3,7,9};
System.out.println("数组排序前顺序:");
for (int n:arr){
System.out.println(n);
}
//希尔排序
SheelSort(arr);
System.out.println("\n数组排序后顺序:");
for (int n:arr){
System.out.println(n);
}
}
//希尔排序
private static void SheelSort(int[] arr){
int i,j,temp,gap=1,len=arr.length;
while (gap0;gap/=3){
for (i=gap;i=0&&arr[j]>temp;j-=gap){
arr[j+gap]=arr[j];
}
arr[j+gap]=temp;
}
}
}
}
归并排序:
public class MergeSort {
public static void main(String[] args) {
int arr[] = {1,4,6,8,2,5,3,7,9};
System.out.println("数组排序前顺序:");
for(int n : arr){
System.out.print(n+" ");
}
//归并排序
int lower = 0;
int upper = arr.length-1;
mergeSort(arr, lower, upper);
System.out.println("\n数组排序后顺序:");
for(int n : arr){
System.out.print(n+" ");
}
}
//归并排序
private static void mergeSort(int[] arr, int lower, int upper) {
if (lower < upper) {
//找出中间索引
int middle = (lower + upper)/2;
//对左边数组进行递归
mergeSort(arr, lower, middle); //注意:此处和快速排序不一样,middle不需要减1,组成一个完整序列的下标
//对右边数组进行递归
mergeSort(arr, middle+1, upper);
//合并
merge(arr, lower, middle, upper);
}
}
//归并
private static void merge(int[] arr, int lower, int middle, int upper) {
int[] tempArr = new int[arr.length]; //建立一个中间数组
int mid = middle + 1; // 第二个子序列的第一个下标
int third = lower; //third记录中间数组的索引
int temp = lower;
while (lower <= middle && mid <= upper) {
//从两个数组中取出最小的放入中间数组
if (arr[lower] <= arr[mid]) {
tempArr[third++] = arr[lower++];
} else {
tempArr[third++] = arr[mid++];
}
}
//剩余部分依次放入中间数组
while (mid <= upper) {
tempArr[third++] = arr[mid++];
}
while (lower <= middle) {
tempArr[third++] = arr[lower++];
}
//将中间数组中的内容复制回原数组
while (temp <= upper) {
arr[temp] = tempArr[temp++];
}
}
}
基数排序:
public class JiShuSort {
public static void main(String[] args) {
int arr[] = {1,4,6,8,2,5,3,7,9};
System.out.println("数组排序前顺序:");
for(int n : arr){
System.out.print(n+"");
}
//基数排序
radixSort(arr);
System.out.println("\n数组排序后顺序:");
for (int n:arr){
System.out.print(n+"");
}
}
//基数排序
private static void radixSort(int[] arr){
//首先确定排序的趟数
int max=arr[0];
for (int i=1;imax){
max=arr[i];
}
}
int time=0;
//判断位数
while (max>0){
max/=10;
time++;
}
//建立10个List集合
List> list=new ArrayList>();
for (int i=0;i<10;i++){
List list1 = new ArrayList();
list.add(list1);
}
//进行time次分配和收集
for (int i=0;i