1. 选择排序
package MySort;
import java.util.Arrays;
public class SelectSort {
public static void main(String[] args) {
int[] arr = {3,6,9,1,5};
selectSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void selectSort(int[] arr) {
for (int i=0;i<arr.length-1;i++) {
int min=i;
for (int j=i+1;j<arr.length;j++) {
if (arr[j]<arr[min]) {
min=j;
}
}
swap(arr,i,min);
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i]=arr[j];
arr[j]= temp;
}
}
2. 冒泡排序
package MySort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {4,1,3,7,2};
bubbleSrot(arr);
System.out.println(Arrays.toString(arr));
}
private static void bubbleSrot(int[] arr) {
for (int i=0;i<arr.length-1;i++) {
for (int j=0;j<arr.length-i-1;j++) {
if (arr[j]>arr[j+1]) {
swap(arr,j,j+1);
}
}
}
}
private static void swap(int[] arr, int i, int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
3. 插入排序
package MySort;
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[]arr = {6,3,5,9,2};
insertSort1(arr);
System.out.println(Arrays.toString(arr));
}
private static void insertSort(int[] arr) {
for (int i=1;i<arr.length;i++) {
int j;
for (j=i;j>0&&arr[j]<arr[j-1];j--) {
swap(arr,j,j-1);
}
}
}
private static void swap(int[] arr, int j, int i) {
int temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
private static void insertSort1(int[] arr) {
for (int i=1;i<arr.length;i++) {
int a = arr[i];
int j ;
for (j=i;j>0&&a>arr[j-1];j--) {
arr[j]=arr[j-1];
}
arr[j]=a;
}
}
}
4. 希尔排序
package MySort;
import java.util.Arrays;
public class ShellSortTest {
public static void main(String[] args) {
int[] arr = {1,13,5,8,15,4,32,90,56,34,2,44};
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void shellSort(int[] arr) {
int length = arr.length;
for (int gap = length/2;gap>0;gap=gap/2) {
insertSort(arr,gap);
}
}
private static void insertSort(int[] arr, int gap) {
for(int i=gap;i<arr.length;i++) {
int temp = arr[i];
int j;
for(j=i;j>gap-1&&temp<arr[j-gap];j=j-gap) {
arr[j] = arr[j-gap];
}
arr[j] = temp;
}
}
}
5. 堆排序
package MySort;
import java.util.Arrays;
public class Stack {
public static void main(String[] args) {
int[] arr = {2,4,7,9,1,5,8};
stackSort(arr);
System.out.println(Arrays.toString(arr));
}
public static boolean less(int m,int n) {
return (m<n);
}
public static void each(int[]arr,int i,int j) {
int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void swim(int[]arr,int k) {
while(k>1 && less(arr[k/2],arr[k])) {
each(arr,k/2,k);
k=k/2;
}
}
public static void sink(int[]arr,int k,int N) {
while (k*2<=N) {
int i=k*2;
if ((i<N)&&less(arr[i],arr[i+1])) {
i=i+1;
}
if (!less(arr[k],arr[i])) {
break;
}
each(arr,k,i);
k=i;
}
}
public static int[] getStack(int[] arr) {
int N = arr.length;
int[] aux = new int[N+1];
for (int i = 1;i<=N;i++) {
aux[i] = arr[i-1];
}
aux[0] = -1;
for (int k=N/2;k>=1;k--) {
sink(aux,k,N);
}
return aux;
}
private static void stackSort(int[] arr) {
sort(arr);
}
public static void sort(int[]arr) {
int N = arr.length;
int[] aux = getStack(arr);
System.out.println(Arrays.toString(aux));
while (N>1) {
each(aux,1,N--);
sink(aux,1,N);
}
for (int i = 1;i<aux.length;i++) {
arr[i-1]=aux[i];
}
aux = null;
}
}
6. 归并排序
package MySort;
import java.util.Arrays;
public class MergerSort {
private static int[] aux;
public static void main(String[] args) {
int[] arr ={6,5,7,8,4,9,13,2,1,3,12,10,11};
mergerSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void mergerSort(int[] arr) {
aux=new int[arr.length];
sort(arr,0,arr.length-1);
}
private static void sort(int[] arr, int low, int high) {
if (low>=high){
return;
}
int mid = (low+high)/2;
sort(arr,low,mid);
sort(arr,mid+1,high);
merger(arr,low,mid,high);
}
private static void merger(int[] arr, int low, int mid, int high) {
for (int i=low;i<=high;i++) {
aux[i]=arr[i];
}
int i=low;
int j=mid+1;
for (int k=low;k<=high;k++) {
if (i>mid) {
arr[k]=aux[j++];
} else if (j>high) {
arr[k]=aux[i++];
} else if (aux[i]>aux[j]) {
arr[k]=aux[j++];
} else {
arr[k]= aux[i++];
}
}
}
}
package MySort;
import java.util.Arrays;
public class MergeSort2 {
private static int[] aux;
public static void main(String[] args) {
int[]arr = {5,6,7,4,8,3,9,1,2,10};
mergeSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void mergeSort(int[] arr) {
aux = new int[arr.length];
for(int i=1;i<arr.length;i=i+i) {
for (int j=0;j<arr.length;j=j+i*2) {
merge(arr,j,j+i-1,Math.min(arr.length-1, j+2*i-1));
}
}
}
private static void merge(int[] arr, int low, int mid, int high) {
int i=low;
int j=mid+1;
for (int k=low;k<=high;k++) {
aux[k]=arr[k];
}
for (int k=low;k<=high;k++) {
if(i>mid) {
arr[k]=aux[j++];
} else if (j>high) {
arr[k]=aux[i++];
} else if((aux[i]>aux[j])) {
arr[k]=aux[j++];
} else {
arr[k]=aux[i++];
}
}
}
}
7. 快排
package MySort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {3,6,9,2,5,8,1,4,7,22,17};
quickSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void quickSort(int[] arr) {
quickSort(arr,0,arr.length-1);
}
private static void quickSort(int[] arr, int low, int high) {
if (low>=high) {
return;
}
int j=partition(arr,low,high);
quickSort(arr,low,j-1);
quickSort(arr,j+1,high);
}
private static int partition(int[] arr, int low, int high) {
int temp = arr[low];
int i=low;
int j=high+1;
while(true) {
while(arr[++i]<temp) {
if (i==high) {
break;
}
}
while(arr[--j]>temp) {
if (j==low) {
break;
}
}
if (i>=j) {
break;
}
swap(arr,i,j);
}
swap(arr,low,j);
return j;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
package MySort;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.TreeSet;
public class QuickSort3 {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(1,11,3,4,15,6);
sort(list);
System.out.println(list);
}
private static void sort(List<Integer> list) {
sort(list,0,list.size()-1);
}
private static void sort(List<Integer> list, int low, int high) {
if(low>=high) return ;
int k = partition(list,low,high);
sort(list,low,k-1);
sort(list,k+1,high);
}
private static int partition(List<Integer> list, int low, int high) {
int i=low;
int j=high+1;
int temp = list.get(low);
while(true) {
while(less(list.get(++i),temp)){
if(i==high) break;
}
while(less(temp,list.get(--j))){
if(j==low) break;
}
if(i>=j) break;
swap(list,i,j);
}
swap(list,j,low);
return j;
}
private static void swap(List<Integer> list, int i, int j) {
int temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
private static boolean less(int a, int b) {
return a<b;
}
}
package MySort;
import java.util.Arrays;
public class QuickSort2 {
public static void main(String[] args) {
int[] arr = {3,6,9,8,2,16,7,1,5};
quickSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void quickSort(int[] arr) {
quickSort(arr,0,arr.length-1);
}
private static void quickSort(int[] arr, int low, int high) {
if (low>=high) {
return;
}
int lt=low;
int i=low+1;
int gt=high;
int temp = arr[low];
while (i<=gt) {
int cmp = arr[i]-temp;
if (cmp<0) {
swap(arr,i++,lt++);
} else if (cmp>0) {
swap(arr,i,gt--);
} else {
i++;
}
}
quickSort(arr,low,lt-1);
quickSort(arr,gt+1,high);
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}