排序算法浅析——选择算法

选择算法

选择排序—简单选择算法(Selection sort)

算法描述

》每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。即,先选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

》具体过程如下图所示:

算法分析

平均时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:不稳定

代码实现

public class SelectionSort {

    public static int[] selection(int[] sort){

        for(int i = 0; i < sort.length; i++){
            int temp = sort[i];
            int tempIndex = i;
            for(int flag = i; flag < (sort.length - 1); flag++){
                if(sort[flag + 1] < temp){
                    temp = sort[flag + 1];
                    tempIndex = flag + 1;
                }

            }
            sort[tempIndex] = sort[i];
            sort[i] = temp;
        }

        return sort;
    }

    public static void main(String[] args) {
        int[] test = { 3, 1, 5, 7, 2, 4, 9, 6 };
        int[] test2 = SelectionSort.selection(test);
        for (int result : test2) {
            System.out.print(result + " ");
        }
    }

}

堆排序(Heapsort)

算法描述

1)将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆(小顶堆),此堆为初始的无序区;

2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];

3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

》具体过程如下:

若对数组{16,7,3,20,17,8}进行堆排序,先构建一个完全二叉树,

然后开始构建初始的大顶堆,从最后一个非叶子节点开始,

20和16交换后导致16不满足堆的性质,因此接着重新调整,

这样等到了初始堆,之后就开始进行排序。将20跟3交换,

这时又不满足堆,接着调整,

接着按照上述过程操作,

算法分析

平均时间复杂度:O(N*logN)

空间复杂度:O(1)

稳定性:不稳定

代码实现

public class HeapSort {

    public int heap[];
    public int size;

    public HeapSort(int[] heap){
        this.heap = heap;
        this.size = heap.length;
    }

    public void buildMaxHeap(){
        for(int i = size/2-1; i >= 0; i--){
            adjust(i);
        }
    }

    public void adjust(int index){
        int l = 2 * (index + 1) - 1; // 左孩子
        int r = 2 * (index + 1); // 右孩子
        int largest;

        if(l < size && heap[l] > heap[index]){
            largest = l;
        } else {
            largest = index;
        }
        if(r < size && heap[r] > heap[largest]) {
            largest = r;
        } 

        if(largest == index || largest > size){
            return;
        }

        int temp = heap[index];
        heap[index] = heap[largest];
        heap[largest] = temp;
        adjust(largest);
    }

    public void heap(){

        for(int i = 0; i < heap.length; i++){
            buildMaxHeap();
            int temp = heap[0];
            heap[0] = heap[size-1];
            heap[size-1] = temp;
            size--;
        }
    }

    public static void main(String[] args) {
        int[] test= { 3, 1, 5, 7, 2, 4, 9, 6 };
        HeapSort hs = new HeapSort(test);
        hs.heap();
        for (int result : hs.heap) {
            System.out.print(result + " ");
        }
    }
}

参考:

http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html

http://www.360doc.com/content/14/0507/19/18042_375598267.shtml

时间: 2024-12-17 05:38:08

排序算法浅析——选择算法的相关文章

Java连载70-冒泡算法、选择算法

一.冒泡排序 1.也就是依次选出最大的放在最后面 package com.bjpowernode.java_learning; ? public class D70_1_BubbleSort { public static void main(String[] args) { /* * 冒泡排序算法:有一个int类型的数组:3 1 6 2 5 */ int[] a = {3,1,6,2,5,45,8,9,86}; //开始排序 for (int i=a.length-1;i>0;i--) { f

【数据结构与算法】选择排序

选择排序没什么好说的,直接上代码吧 public class SelectSort { public void selectSort(int[] in) { int inLength = in.length; int minIndex = 0; for (int i = 0; i < inLength; i++) { minIndex = i; for (int j = i + 1; j < inLength; j++) { if (in[j] < in[minIndex]) { min

经典排序算法--简单选择排序

算法简介 简单选择排序是一种选择排序. 选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止. 白话理解 依然已排队为例,在排队时,有的老师可能会选择这样排序,先在一列中选出最矮的,放在第一位,然后选出第二矮的,放在第二位.队伍完成排序.而这就是选择排序的思想. 简单排序处理流程 (1)从待排序序列中,找到关键字最小的元素: (2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换: (3)从余下的 N - 1 个元素中,找出关键字最小

java基础算法之选择排序

选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 时间复杂度  选择排序的交换操作介于 0 和 (n - 1) 次之间.选择排序的比较操作为 n (n - 1) / 2 次之间.选择排序的赋值操作介于 0 和 3 (n - 1) 次之间.比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(

数据结构排序算法之选择排序

今天继续介绍一种排序算法:选择排序. 选择排序的基本思想就是从待排序列中选择出最小的,然后将被选出元素和序列的第一个元素互换位置(当前默认是升序排列),则互换完成后第一个元素就是整个序列的最小的元素,则一次选择排序结束.然后我们从剩下的子序列中选择出最小的,然后将该被选出来的元素和该子序列的第一个元素(即整个序列的第二个元素)互换位置,则当前整个序列的第二个元素就是当前序列中的次最小值,第二次选择排序结束.以此类推,直到该待排序列只剩下一个元素后,则整个序列有序. 具体过程如下图所示: 下面就不

详谈排序算法之选择类排序(两种方法实现堆排序)

   今天我们再来讨论一下选择类排序,选择类排序分为:简单排序,树形选择排序和堆排序.但我们主要说的是简单和堆排序两个,因为树形选择排序使用了较多的辅助空间,以及和∞进行多余比较,为弥补树型选择排序的这些缺点, J.W.J.Williams 在 1964 年提出了进一步的改进方法,即堆排序.对于我个人而言..一开始并不是很理解它的算法思想,纠结了许久.在网上查找资料的时候发现这位大神的文章思路十分清晰,而且把创建堆以及堆化数组的算法讲解的十分详细.如果有不明白堆排序思路的,可以先看看这篇文章~堆

排序算法之选择排序

一. 算法描述 选择排序:在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成. 二. 算法分析 平均时间复杂度:O(n2) 空间复杂度:O(1)  (用于交换和记录索引) 稳定性:不稳定 (比如序列[5, 5, 3]第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 三. 算法实现

“《算法》第4版第2章‘排序’”:初级排序算法(选择、冒泡、插入、希尔)

<算法>第4版作者是Robert Sedgewick 和 Kevin Wayne. 1. 选择排序 选择排序可以说是最简单的排序方法.首先,找到数组中最小的那个元素:其次,将它与数组的第一个元素交换位置(如果第一个元素就是最小元素,那么它就和自己交换):再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置.如此往复,直到将整个数组排序. 该书中提出一个命题:对于长度为N的数组,选择排序需要大约N2/2次比较和N次交换.  程序如下: 1 void SelectionSort::s

算法学习之排序算法:选择排序

选择排序:每一趟在n-i+1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录. 一.简单选择排序 一趟选择排序操作: 通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之. 对L[1...n]中记录进行简单选择排序的算法为:令i从1至n-1,进行n-1趟选择操作.简单选择排序过程中,所需进行记录移动的操作次数较少,然而,无论记录的初始排列如何,所需关键字间的比较次数相同.因此,总的时间复杂度为O(n^2)