版权声明:本文为博主原创文章,未经博主允许不得转载。 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>