选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法
1.简单的选择排序
基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止
2.堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
堆排序可以参考该链接
http://jingyan.baidu.com/article/5225f26b057d5de6fa0908f3.html
堆排序的实现总结来讲,就是先创建一个最大堆,根节点即array[0]为最大值,将这个值与最后一个无序值array[lastindex]交换,交换之后无序值的长度为lastindex-2 而有序值长度为1。至此数组被分为两个部分,第一个部分为需要不同进行堆调整并且缩小长度的无序组,另一个部分为已经排好序的有序组。每一次无序组进行堆调整后,根节点(无序组最大值)被添加到有序组,有序组长度+1 无序组长度 -1
延续以上步骤,直到有序的长度为数组总长度lastindex-1
其中,当根节点从0开始时,根节点i的左右子树分别为2i+1;2i+2, 第i个结点的父结点为(i-1)/2
public class SelectionSort {
static int[] array = {58,49,2,95,111,30,5,46,7,11,1,66,77,42,86,66,2};
public static void main(String[] args) {
// TODO Auto-generated method stub
PrintArray(array);
//SelectSort();
HeapSort();
}
private static void HeapSort() {
// TODO Auto-generated method stub
for(int i=array.length-1;i>=0;i--){
buildHeap(i);
swapValue(i);
}
PrintArray(array);
}
private static void swapValue(int index) {
// TODO Auto-generated method stub
int temp = array[index];
array[index]=array[0];
array[0]=temp;
}
private static void buildHeap(int index) {
// TODO Auto-generated method stub
for(int i=(index-1)/2;i>=0;i--)// 从根节点i开始比较
{
int leftnode = 2*i+1;
int rightnode= 2*i+2;
int maxindex =i; //记录最大值的所在下标
if(leftnode<=index&&array[leftnode]>array[maxindex])//存在左子树并且大于根节点
{
maxindex = leftnode; //maxindex记录最大值
}
if(rightnode<=index && array[rightnode]>array[maxindex])
{
maxindex = rightnode;
}
//根节点不是最大值时,将较大值赋给根节点
if(maxindex!=i)
{
int temp = array[i];
array[i] = array[maxindex];
array[maxindex]=temp;
}
}
}
private static void SelectSort() {
// TODO Auto-generated method stub
for(int i=0;i<array.length;i++)
{
int min = i;
for(int j=i+1;j<array.length;j++)
{
if (array[j]<array[min])
{
min = j;
}
}
// System.out.println("min"+min);
int temp = array[i];
array[i]=array[min];
array[min]=temp;
}
PrintArray(array);
}
private static void PrintArray(int[] array2) {
// TODO Auto-generated method stub
for (int i =0; i< array.length;i++)
{
System.out.print(array[i]+" ");
}
System.out.println("");
}
}