几种常见的排序
1.冒泡排序
public static int[] Bubble(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
2.直接插入排序
public static int[] Selection(int[] arr){
for(int i=1;i<arr.length;i++){
for(int j=i;j>0;j--){
if(arr[j]<arr[j-1]){
int temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
return arr;
}
3.选择排序
public static int[] SelectionSort(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;
}
}
}
return arr;
}
4.希尔排序
public static int[] ShellSort(int[] arr){
int gap=1;
while(gap<arr.length/3){
gap=gap*3+1;
}
for(int h=gap;h>0;h=(h-1)/3){
for(int i=h;i<arr.length;i++){
for(int j=i;j>h-1;j=j-h){
if(arr[j]<arr[j-h]){
int temp=arr[j];
arr[j]=arr[j-h];
arr[j-h]=temp;
}
}
}
}
return arr;
}
5.快速排序
public static int[] QuickSort(int[] arr,int start,int end){
if(start<end){
int index=getIndex(arr,start,end);
QuickSort(arr,start,index-1);
QuickSort(arr,index+1,end);
}
return arr;
}
public static int getIndex(int[] arr,int start,int end){
int i=start;
int j=end;
int ret=arr[i];
while(i<j){
while(i<j && arr[j]>ret){
j--;
}
if(i<j){
arr[i]=arr[j];
i++;
}
while(i<j && arr[i]<ret){
i++;
}
if(i<j){
arr[j]=arr[i];
j--;
}
}
arr[i]=ret;
return i;
}
6.归并排序
public static void MergeSort(int[] arr){
chaifen(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void chaifen(int[] arr,int start,int end){
int center=(start+end)/2;
if(start<end){
chaifen(arr,start,center);
chaifen(arr,center+1,end);
guibing(arr,start,center,end);
}
}
public static void guibing(int[] arr,int start,int center,int end) {
int i = start;
int j = center + 1;
int index = 0;
int[] temp = new int[end - start + 1];
while (i <= center && j <= end) {
if (arr[i] <= arr[j]) {
temp[index] = arr[i];
i++;
} else {
temp[index] = arr[j];
j++;
}
index++;
}
while (i <= center) {
temp[index] = arr[i];
i++;
index++;
}
while (j <= end) {
temp[index] = arr[j];
j++;
index++;
}
for(int m=0;m<temp.length;m++){
arr[m+start]=temp[m];
}
}
7.基数排序
public static void CardinalitySort(int [] arr){
int max=getMax(arr);
int len=String.valueOf(max).length();
int[][] ret=new int[10][arr.length];
int[] counts=new int[10];
for(int i=0,n=1;i<len;i++,n*=10){
for(int j=0;j<arr.length;j++){
int ys=arr[j]/n%10;
ret[ys][counts[ys]++]=arr[j];
}
int index=0;
for(int k=0;k<counts.length;k++){
if(counts[k]!=0){
for(int m=0;m<counts[k];m++){
arr[index]=ret[k][m];
index++;
}
}
counts[k]=0;
}
}
System.out.println(Arrays.toString(arr));
}
public static int getMax(int[] arr){
int flag=arr[0];
for(int i=1;i<arr.length;i++){
if(arr[i]>flag){
flag=arr[i];
}
}
return flag;
}
8.堆排序
public static void HeapSort(int[] arr){
int startIndex=(arr.length-1)/2;
for(int i=startIndex;i>=0;i--){
HeapSort2(arr,arr.length,i);
}
System.out.println(Arrays.toString(arr));
for(int i=arr.length-1;i>0;i--){
int t=arr[0];
arr[0]=arr[i];
arr[i]=t;
HeapSort2(arr,i,0);
}
System.out.println(Arrays.toString(arr));
}
public static void HeapSort2(int[] arr,int size,int index){
int maxIndex=index;
int leftNode=index*2+1;
int rightNode=index*2+2;
if(leftNode<size && arr[leftNode]>arr[maxIndex]){
maxIndex=leftNode;
}
if(rightNode<size && arr[rightNode]>arr[maxIndex]){
maxIndex=rightNode;
}
if(index!=maxIndex){
int t=arr[maxIndex];
arr[maxIndex]=arr[index];
arr[index]=t;
HeapSort2(arr,size,maxIndex);
}
}