Java 内部排序法总结与源码

总结

在这里插入图片描述

1.1 冒泡排序

代码片.

public class Sort {
	public static void bubbleSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		for (int e = arr.length - 1; e > 0; e--) {
			for (int i = 0; i < e; i++) {
				if (arr[i] > arr[i + 1]) {
					swap(arr, i, i + 1);
				}
			}
		}
	}
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

	public static void Print(String s,int []arr) 
	{
		System.out.print(s+" : ");
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
	public static void main(String[] args) 
	{
		int[]  arr= {9,5,6,7,1,3,2,4};
		Print( "排序前",arr) ;
		bubbleSort( arr);
		Print( "排序后",arr) ;
	}
}

输出.

	排序前 : 9 5 6 7 1 3 2 4 
	排序后 : 1 2 3 4 5 6 7 9 

1.2 选择排序

代码片.

public class Sort {
	public static void selectionSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		for (int i = 0; i < arr.length - 1; i++) {
			int minIndex = i;
			for (int j = i + 1; j < arr.length; j++) {
				minIndex = arr[j] < arr[minIndex] ? j : minIndex;
			}
			swap(arr, i, minIndex);
		}
	}
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

	public static void Print(String s,int []arr) 
	{
		System.out.print(s+" : ");
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
	public static void main(String[] args) 
	{
		int[]  arr= {9,5,6,7,1,3,2,4};
		Print( "排序前",arr) ;
		selectionSort( arr);
		Print( "排序后",arr) ;
	}
}

输出.

	排序前 : 9 5 6 7 1 3 2 4 
	排序后 : 1 2 3 4 5 6 7 9 

1.3 插入排序

代码片.

public class Sort {
	public static void insertionSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		for (int i = 1; i < arr.length; i++) {
			for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
				swap(arr, j, j + 1);
			}
		}
	}
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

	public static void Print(String s,int []arr) 
	{
		System.out.print(s+" : ");
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
	public static void main(String[] args) 
	{
		int[]  arr= {9,5,6,7,1,3,2,4};
		Print( "排序前",arr) ;
		insertionSort( arr);
		Print( "排序后",arr) ;
	}
}

输出.

	排序前 : 9 5 6 7 1 3 2 4 
	排序后 : 1 2 3 4 5 6 7 9 	

1.4 希尔排序

代码片.

public class Sort {
	public static void shellSort(int[] arr){
		if (arr == null || arr.length < 2) {
			return;
		}	 
	    int inserIndex = 0;
	    int gap = arr.length/2;
	    while (gap>0)
	    {
	        for (int i = gap; i < arr.length; i++) {
	            inserIndex =i;
	            int temp = arr[i];
	            while (inserIndex>=gap && arr[inserIndex-gap]>temp){
	                arr[inserIndex] = arr[inserIndex-gap];
	                inserIndex-=gap;
	            }
	            arr[inserIndex]=temp;
	        }
	        gap = gap/2;
	    }	   
	}
	
	public static void Print(String s,int []arr) 
	{
		System.out.print(s+" : ");
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
	public static void main(String[] args) 
	{
		int[]  arr= {9,5,6,7,1,3,2,4};
		Print( "排序前",arr) ;
		shellSort( arr);
		Print( "排序后",arr) ;
	}
}

输出.

	排序前 : 9 5 6 7 1 3 2 4 
	排序后 : 1 2 3 4 5 6 7 9 	

2.1 快速排序

代码片.

public class Sort {
	public static void quickSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		quickSort(arr, 0, arr.length - 1);
	}

	public static void quickSort(int[] arr, int l, int r) {
		if (l < r) {
			swap(arr, l + (int) (Math.random() * (r - l + 1)), r);
			int[] p = partition(arr, l, r);
			quickSort(arr, l, p[0] - 1);
			quickSort(arr, p[1] + 1, r);
		}
	}

	public static int[] partition(int[] arr, int l, int r) {
		int less = l - 1;
		int more = r;
		while (l < more) {
			if (arr[l] < arr[r]) {
				swap(arr, ++less, l++);
			} else if (arr[l] > arr[r]) {
				swap(arr, --more, l);
			} else {
				l++;
			}
		}
		swap(arr, more, r);
		return new int[] { less + 1, more };
	}
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

	public static void Print(String s,int []arr) 
	{
		System.out.print(s+" : ");
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
	public static void main(String[] args) 
	{
		int[]  arr= {9,5,6,7,1,3,2,4};
		Print( "排序前",arr) ;
		quickSort( arr);
		Print( "排序后",arr) ;
	}
}

输出.

	排序前 : 9 5 6 7 1 3 2 4 
	排序后 : 1 2 3 4 5 6 7 9 	

2.2 堆积排序

代码片.

public class Sort {
	public static void heapSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		for (int i = 0; i < arr.length; i++) {
			heapInsert(arr, i);
		}
		int size = arr.length;
		swap(arr, 0, --size);
		while (size > 0) {
			heapify(arr, 0, size);
			swap(arr, 0, --size);
		}
	}

	public static void heapInsert(int[] arr, int index) {
		while (arr[index] > arr[(index - 1) / 2]) {
			swap(arr, index, (index - 1) / 2);
			index = (index - 1) / 2;
		}
	}

	public static void heapify(int[] arr, int index, int size) {
		int left = index * 2 + 1;
		while (left < size) {
			int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;
			largest = arr[largest] > arr[index] ? largest : index;
			if (largest == index) {
				break;
			}
			swap(arr, largest, index);
			index = largest;
			left = index * 2 + 1;
		}
	}
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

	public static void Print(String s,int []arr) 
	{
		System.out.print(s+" : ");
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
	public static void main(String[] args) 
	{
		int[]  arr= {9,5,6,7,1,3,2,4};
		Print( "排序前",arr) ;
		heapSort( arr);
		Print( "排序后",arr) ;
	}
}

输出.

	排序前 : 9 5 6 7 1 3 2 4 
	排序后 : 1 2 3 4 5 6 7 9 		

2.3 基数排序

代码片.

public class Sort {
	public static void radixSort(int[] arr) {
		if (arr == null || arr.length < 2) {
			return;
		}
		radixSort(arr, 0, arr.length - 1, maxbits(arr));
	}

	public static int maxbits(int[] arr) {
		int max = Integer.MIN_VALUE;
		for (int i = 0; i < arr.length; i++) {
			max = Math.max(max, arr[i]);
		}
		int res = 0;
		while (max != 0) {
			res++;
			max /= 10;
		}
		return res;
	}

	public static void radixSort(int[] arr, int begin, int end, int digit) {
		final int radix = 10;
		int i = 0, j = 0;
		int[] count = new int[radix];
		int[] bucket = new int[end - begin + 1];
		for (int d = 1; d <= digit; d++) {
			for (i = 0; i < radix; i++) {
				count[i] = 0;
			}
			for (i = begin; i <= end; i++) {
				j = getDigit(arr[i], d);
				count[j]++;
			}
			for (i = 1; i < radix; i++) {
				count[i] = count[i] + count[i - 1];
			}
			for (i = end; i >= begin; i--) {
				j = getDigit(arr[i], d);
				bucket[count[j] - 1] = arr[i];
				count[j]--;
			}
			for (i = begin, j = 0; i <= end; i++, j++) {
				arr[i] = bucket[j];
			}
		}
	}

	public static int getDigit(int x, int d) {
		return ((x / ((int) Math.pow(10, d - 1))) % 10);
	}
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}

	public static void Print(String s,int []arr) 
	{
		System.out.print(s+" : ");
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");
		System.out.println();
	}
	public static void main(String[] args) 
	{
		int[]  arr= {9,5,6,7,1,3,2,4};
		Print( "排序前",arr) ;
		radixSort( arr);
		Print( "排序后",arr) ;
	}
}

输出.

	排序前 : 9 5 6 7 1 3 2 4 
	排序后 : 1 2 3 4 5 6 7 9	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值