复杂选择排序(Selection sort)是一种复杂直观的排序算法。它的任务原理:首先在未排序序列中找到最小(大)元素,寄存到排序序列的起始位置,然后,再从剩余未排序元素中继续寻觅最小(大)元素,然后放到 「已排序序列的末尾」 。以此类推,直到一切元素均排序终了。
实现代码为:
public 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; // 改换最小位置
}
}
if (min != i) {
swap(arr, i, min); // 与第i个位置停止交流
}
}
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
关于堆排序,首先是树立在堆的基础上,堆是一棵完全二叉树,还要先看法下大根堆和小根堆,完全二叉树中一切节点均大于(或小于)它的孩子节点,所以这里就分为两种状况
假设一切节点 「大于」 孩子节点值,那么这个堆叫做 「大根堆」 ,堆的最大值在根节点。
假设一切节点 「小于」 孩子节点值,那么这个堆叫做 「小根堆」 ,堆的最小值在根节点。
堆排序首先就是 「建堆」 ,然后再是调整。关于二叉树(数组表示),我们从下往上停止调整,从 「第一个非叶子节点」 末尾向前调整,关于调整的规则如下:
建堆是一个O(n)的时间复杂度进程,建堆完成后就需求停止删除头排序。给定数组建堆(creatHeap)
①从第一个非叶子节点末尾判别交流下移(shiftDown),使妥以后节点和子孩子可以保持堆的性质
②但是普通节点交流能够没成绩,对假设交流打破子孩子堆结构性质,那么就要重新下移(shiftDown)被交流的节点不断到中止。
堆结构完成,取第一个堆顶元素为最小(最大),剩下左右孩子依然满足堆的性值,但是缺个堆顶元素,假设给孩子调下去,能够会调动太多并且能够破坏堆结构。
①所以索性把最后一个元素放到第一位。这样只需求判别交流下移(shiftDown),不过需求留意此时整个堆的大小曾经发作了变化,我们在逻辑上不会运用被丢弃的位置,所以在设计函数的时分需求附带一个堆大小的参数。
②重复以上操作,不断堆中一切元素都被取得中止。
而堆算法复杂度的剖析上,之前建堆时间复杂度是O(n)。而每次删除堆顶然后需求向下交流,每个个数最坏为logn个。这样复杂度就为O(nlogn).总的时间复杂度为O(n)+O(nlogn)=O(nlogn).
实现代码为:
static void swap(int arr[],int m,int n)
{
int team=arr[m];
arr[m]=arr[n];
arr[n]=team;
}
//下移交流 把以后节点有效变换成一个堆(小根)
static void shiftDown(int arr[],int index,int len)//0 号位置不用
{
int leftchild=index*2+1;//左孩子
int rightchild=index*2+2;//右孩子
if(leftchild>=len)
return;
(责任编辑:admin)