1. 选择排序
public class SelectSort {
public static void sort(int[] arr) {
for(int i=0;i<arr.length;i++) {
for(int j=i+1;j<arr.length;j++) {
if(arr[i]>arr[j]) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
}
2. 插入排序
public class InsertSort {
public static void sort(int[] arr) {
for(int i=1;i<arr.length;i++) {
int temp=arr[i];
int j;
for(j=i-1;j>=0;j--) {
if(arr[j]>temp) {
arr[j+1]=arr[j];
}else {
break;
}
}
arr[j+1]=temp;
}
}
3. 冒泡排序
public class BubbleSort {
public static void sort(int[] arr) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr.length-i-1;j++) {
if(arr[j]>arr[j+1]) {
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
}
4. 归并排序
public class MergeSort {
public static void sort(int[] arr) {
mergeSort(arr,0,arr.length-1);
}
public static void mergeSort(int[] arr,int start,int end) {
if(start<end) {
int center=(start+end)/2;
mergeSort(arr,start,center);
mergeSort(arr,center+1,end);
merge(arr,start,end);
}
}
public static void merge(int[] arr,int start,int end) {
int center=(start+end)/2;
int p1=start;
int p2=center+1;
int[] temp=new int[end-start+1];
int pTemp=0;
while(p1<=center&&p2<=end) {
if(arr[p1]<=arr[p2]) {
temp[pTemp++]=arr[p1++];
}
else {
temp[pTemp++]=arr[p2++];
}
}
while(p1<=center) {
temp[pTemp++]=arr[p1++];
}
while(p2<=end) {
temp[pTemp++]=arr[p2++];
}
for(int i=0;i<temp.length;i++) {
arr[start+i]=temp[i];
}
}
5. 快速排序
public class QuickSort {
public static void sort(int[] arr) {
if(arr.length==0) {
return;
}
quickSort(arr,0,arr.length-1);
}
public static void quickSort(int arr[],int start,int end) {
int pivot=median(arr,start,end);
change(arr,end,pivot);
pivot=end;
int p1=start;
int p2=end-1;
while(p1<p2) {
while(p1<p2&&arr[p1]<=arr[pivot]) {
p1++;
}
while(p1<p2&&arr[p2]>=arr[pivot]) {
p2--;
}
if(p1<p2) {
change(arr,p1,p2);
}
}
change(arr,pivot,p1);
pivot=p1;
if(pivot-start>1) {
quickSort(arr, start, pivot-1);
}
if(end-pivot>1) {
quickSort(arr, pivot+1, end);
}
}
public static void change(int[] arr,int i,int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static int median(int[] arr,int start,int end) {
int centerI=(end-start)/2;
if((arr[centerI]-arr[start])*(arr[end]-arr[start])<=0) {
return start;
}
else if((arr[centerI]-arr[end])*(arr[start]-arr[end])<=0) {
return end;
}
else {
return centerI;
}
}
}
6. 希尔排序
public class ShellSort {
public static void sort(int[] arr) {
for(int gap=arr.length/2;gap>=1;gap=gap/2) {
for(int i=gap;i<arr.length;i++) {
int temp=arr[i];
int j;
for(j=i-gap;j>=0;j-=gap) {
if(arr[j]>temp) {
arr[j+gap]=arr[j];
}else {
break;
}
}
arr[j+gap]=temp;
}
}
}
}
7. 堆排序
public class HeapSort {
public static void sort(int[] arr) {
buildHeap(arr);
for(int i=0;i<arr.length;i++) {
arr[arr.length-i-1]=remove(arr,arr.length-i);
}
}
public static void buildHeap(int[] arr) {
for(int i=(arr.length-1)/2;i>=0;i--) {
percolateDown(arr,i,arr.length);
}
}
public static int remove(int[] arr,int length) {
int re=arr[0];
arr[0]=arr[length-1];
percolateDown(arr,0, length-1);
return re;
}
public static void percolateDown(int[] arr,int i,int length) {
while((i+1)*2-1<length) {
int child;
if((i+1)*2<length) {
child=arr[(i+1)*2-1]<arr[(i+1)*2]?(i+1)*2-1:(i+1)*2;
}
else {
child=(i+1)*2-1;
}
if(arr[i]>arr[child]) {
int temp=arr[i];
arr[i]=arr[child];
arr[child]=temp;
i=child;
}
else {
break;
}
}
}
}