排序java实现(选择、冒泡、插入、希尔、堆、归并、快排)

版权声明:转载请标明出处 https://blog.csdn.net/weixin_40661297/article/details/89605919

1. 选择排序

package MySort;

import java.util.Arrays;

/**
 * 选择排序
 * @author Archerlu
 *
 */
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;

/**
 * 冒泡排序
 * @author Archerlu
 *
 */
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;

/**
 * 插入排序
 * @author Archerlu
 *
 */
public class InsertSort {
	public static void main(String[] args) {
		int[]arr = {6,3,5,9,2};
		insertSort1(arr);
		System.out.println(Arrays.toString(arr));
	}

	/**
	 * 方法一
	 * @param 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;
		
	}
	
	
	/**
	 * 方法二 其实与方法一原理本质一样,建议用这个,给数组赋值次数少
	 * @param arr
	 */
	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;

/**
 * 希尔排序,小数组中的插入排序同时进行的:第一个小组先排号第一位,然后第二个小组排第一位,然后第三个小组。。。。。
 * 然后第一个小组排第二位,第二个小组排第二位。。。。
 * @author Archerlu
 *
 */
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));
	}

	//希尔排序,核心为确定递增值gap,分小数组,等差序列为一个数组;然后gap逐渐减小至1,
	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;

/**
 * 堆结构
 * @author Archerlu
 *
 */
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;
	}
	/**
	 * 上浮构造
	 * @param arr
	 * @param k
	 */
	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;
		}
	}
	/**
	 * 下沉构造
	 * @param arr
	 * @param k
	 * @param N
	 */
	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;
		}
	}

	/**将给定数组构建成堆结构
	 * @param arr
	 * @return
	 */
	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;

/**
 * 自顶而下的归并排序
 * @author Archerlu
 *  */
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;

/**
 * 自底而上的归并排序
 * @author Archerlu
 *
 */
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. 快排

  • 快排1 (数组)
package MySort;

import java.util.Arrays;

/**
 * 快排排序
 * @author Archerlu
 *
 */
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;
	}
}

  • 快排2(集合快排)
package MySort;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.TreeSet;

/**
 *利用快排给列表排序
 * @author Archerlu
 *
 */
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;
	}
	
}

  • 快排3(考虑相等元素,)
package MySort;

import java.util.Arrays;

public class QuickSort2 {
	/**
	 * 快速排序-三向切分
	 * @param args
	 */
	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;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40661297/article/details/89605919