Java常用排序算法(二):选择排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Leo_eight/article/details/50950984

一.简单选择排序:


基本思路: 遍历序列, 把最大值放置在序列的第一位, 次最大值放置在第二位

一直循环到最后一位跟倒数最后一位的比较为止.


实例:

初始序列:  34, 08, 23, 99, 12, 34

第一次排序:   99, 34, 08, 23, 12, 34

第二次排序:  99, 34, 08, 23, 12, 34

第三次排序:  99, 34, 34, 08, 23, 12

第四次排序:  99, 34, 34, 23, 08, 12

第五次排序:  99, 34, 34, 23, 12, 08 (排序完成)


分析:效率为O(n^2), 适合与小序列排序.


代码实现:

<strong><span style="color:#33cc00;"><span style="white-space:pre">	</span>public void selectSort(int[] arr) {
		for(int i=0; i<arr.length-1; i++) {
			int min = arr[i];
			for(int j=i+1; j<arr.length; j++) {
				if(arr[j] < min) {
					// 交换
					int temp = arr[j];
					arr[j] = min;
					min = temp;
				}
			}
			arr[i] = min;
		}
	}</span></strong>



2.堆排序


要理解堆排序要先理解何为堆:

具有n个元素的序列k1, k2, ... , kn, 当且仅当满足ki>=k(2i)且ki>=k(2i+1)或 ki<=k(2i)且ki<=k(2i+1), 1<= i<=n/2, 成为堆(heap).

分别称为大根堆和小根堆.

根据堆(大根堆)的定义, 可以把堆看作是父结点的元素均大于其左右子结点的完全二叉树.

对于大根堆, 其堆顶(即树根)的元素最大, 每次取出堆顶, 再重新排放序列就能完成排序


基本思路: 

(1)将序列创建成大根堆

(2)每次取出堆顶元素, 此时堆的结构可能被破坏, 就需要重新建堆

(3)一直循环至最后一个元素, 排序完成


代码实现:

<strong><span style="color:#33cc00;"><span style="white-space:pre">	</span>/**
	 * 堆排序
	 * @param arr
	 */
	public static void headSort(int arr[]) {
		// 创建最大堆
		buildMaxHead(arr);
		for(int i=arr.length-1; i>=1; i--) {
			// 把最大数放置到数组尾
			swap(arr, 0, i);
			// 重新构建最大堆
			heapity(arr, 0, i);
		}
	}
	
	/**
	 * 创建最大堆
	 * @param arr
	 */
	private static void buildMaxHead(int arr[]) {
		int len = arr.length;
		// 遍历树结点, 总共有len/2个
		for(int i=len/2; i>=0; i--) {
			heapity(arr, i, len);
		}
	}
	
	/**
	 * 堆化
	 */
	private static void heapity(int arr[], int currentIndex, int maxIndex) {
		int left = 2*currentIndex+1;             // 左孩子索引
		int right = 2*currentIndex+2;            // 右孩子索引
		int largestIndex = currentIndex;         // 记录父结点与其孩子之间最大值的索引
		
		// 若存在左孩子并其值大于父结点
		if(left < maxIndex && arr[left] > arr[currentIndex])
			largestIndex = left;
		// 若存在右孩子并其值大于父结点
		if(right < maxIndex && arr[right] > arr[largestIndex])
			largestIndex = right;
		
		if(largestIndex != currentIndex) {
			// 把最大值作为父结点
			swap(arr, largestIndex, currentIndex);
			// 递归
			heapity(arr, largestIndex, maxIndex);
		}
	}
	
	private static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}</span></strong>



猜你喜欢

转载自blog.csdn.net/Leo_eight/article/details/50950984