排序算法

本文详细介绍了五种排序算法——插入排序、冒泡排序、分治法归并排序、堆排序和快速排序的实现原理与步骤,并通过示例代码进行演示。此外,还对比了这些算法的时间复杂度和适用场景。
package a.b.c.mytest;

import java.util.Arrays;

public class TestSort {

	/**
	 * 插入排序
	 * 
	 * @param arr
	 */
	public static void insertionSort(int arr[]) {
		int size = arr.length;
		for (int i = 1; i < size; i++) {
			for (int j = 0; j < i; j++) {
				if (arr[i] < arr[j]) {
					int tmp = arr[j];
					arr[j] = arr[i];
					arr[i] = tmp;
				}
			}
		}
	}

	/**
	 * 冒泡排序
	 * 
	 * @param arr
	 */
	public static void maopaoSort(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 tmp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = tmp;
				}
			}
		}
	}

	/**
	 * 分治法,归并排序
	 * 
	 * @param arr
	 */
	public static void mergeSort(int arr[], int start, int end) {
		if (start + 1 < end) {
			int middle = (start + end) / 2;
			mergeSort(arr, start, middle);
			mergeSort(arr, middle, end);
			// merge
			int left[] = Arrays.copyOfRange(arr, start, middle);
			int right[] = Arrays.copyOfRange(arr, middle, end);
			int leftSize = left.length, leftPtr = 0;
			int rightSize = right.length, rightPtr = 0;
			for (int i = start; i < end; i++) {
				if (leftPtr >= leftSize) {
					arr[i] = right[rightPtr];
					rightPtr++;
				} else if (rightPtr >= rightSize) {
					arr[i] = left[leftPtr];
					leftPtr++;
				} else {
					if (left[leftPtr] <= right[rightPtr]) {
						arr[i] = left[leftPtr];
						leftPtr++;
					} else {
						arr[i] = right[rightPtr];
						rightPtr++;
					}
				}
			}
		}
	}

	/**
	 * 堆排序
	 * 
	 * @param arr
	 */
	public static void heapSort(int arr[]) {
		buildHeap(arr);
		for (int i = arr.length; i > 1; i--) {
			int tmp = arr[0];
			arr[0] = arr[i - 1];
			arr[i - 1] = tmp;
			maxHeapify(arr, 0, i - 1);
		}
	}

	// 保持最大堆性质
	private static void maxHeapify(int arr[], int i, int heapSize) {
		int left = 2 * i + 1;
		int right = 2 * i + 2;
		int max = i;
		if (left + 1 <= heapSize && arr[left] > arr[i]) {
			max = left;
		}

		if (right + 1 <= heapSize && arr[right] > arr[max]) {
			max = right;
		}

		if (max != i) {
			int tmp = arr[i];
			arr[i] = arr[max];
			arr[max] = tmp;
			maxHeapify(arr, max, heapSize);
		}
	}

	// 构建最大堆
	private static void buildHeap(int arr[]) {
		for (int i = arr.length / 2 - 1; i >= 0; i--) {
			maxHeapify(arr, i, arr.length);
		}
	}

	/**
	 * 快速排序
	 * @param arr
	 * @param start
	 * @param end
	 */
	public static void quickSort(int arr[], int start, int end) {
		if(start < end){
			    int middle = arr[start];
			    int left = start;
			    int right = end;
			    while(left < right){
			    	while(left < right && arr[right] >= middle){
			    		right --;
			    	}
			    	arr[left] = arr[right];
			    	
			    	while(left<right && arr[left] < middle){
			    		left ++;
			    	}
			    	arr[right] = arr[left];
			    }
			    arr[left] = middle;
			    quickSort(arr,start,left-1);
			    quickSort(arr,left+1,end);
		}  
	}
	
	/**
	 * 计数排序
	 * @param arr
	 * @param max
	 */
	public static void countingSort(int arr[],int max){
		int c[] = new int[max+1];
		for(int i=0;i<=max;i++){
			c[i] = 0;
		}
		
		for(int i=0;i<arr.length;i++){
			c[arr[i]] = c[arr[i]] + 1;
		}
		
		for(int i=1;i<=max;i++){
			c[i] = c[i-1] + c[i];
		}
		
		int b[] = new int[arr.length];
		
		for(int i=b.length-1;i>=0;i--){
			b[c[arr[i]] - 1] = arr[i];
			c[arr[i]] = c[arr[i]] - 1;
		}
		
		for(int i=0;i<b.length;i++){
			arr[i] = b[i];
		}
	}
	
	
	

	public static void main(String args[]) {
		int arr[] = { 5, 3, 4, 1, 2 };
		System.out.println("原数组:" + Arrays.toString(arr));
		TestSort.insertionSort(arr);
		System.out.println("插入排序结果:" + Arrays.toString(arr));

		int arr1[] = { 5, 3, 4, 1, 2, 10, 4, 9, 7, 8 };
		System.out.println("原数组:" + Arrays.toString(arr1));
		TestSort.mergeSort(arr1, 0, arr1.length);
		System.out.println("归并排序结果:" + Arrays.toString(arr1));

		int arr2[] = { 50, 3, 4, 1, 2, 10, 4, 9, 7, 8 };
		System.out.println("原数组:" + Arrays.toString(arr2));
		TestSort.maopaoSort(arr2);
		System.out.println("冒泡排序结果:" + Arrays.toString(arr2));

		int arr3[] = { 50, 300, 4, 1, 2, 10, 42, 98, 7, 8 };
		System.out.println("原数组:" + Arrays.toString(arr3));
		TestSort.heapSort(arr3);
		System.out.println("堆排序结果:" + Arrays.toString(arr3));
		
		
		int arr4[] = { 50, 300, 4, 1, 2, 10, 42, 98, 7, 8 };
		System.out.println("原数组:" + Arrays.toString(arr4));
		TestSort.quickSort(arr4, 0, arr4.length -1);;
		System.out.println("快速排序结果:" + Arrays.toString(arr4));
		

		int arr5[] = { 500, 300, 4, 1, 2, 10, 42, 98, 7, 8 };
		System.out.println("原数组:" + Arrays.toString(arr5));
		TestSort.countingSort(arr5, 500);
		System.out.println("计数排序结果:" + Arrays.toString(arr5));
	}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈浩_浩哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值