八大排序方法解析与巧记(三)选择排序

来源:互联网 发布:青牛软件电话 编辑:程序博客网 时间:2024/05/11 14:20

1. 基本介绍

选择排序分为两类:简单选择排序和堆排序。简单选择排序,真的很简单:从排在待排序元素后面的元素中选一个最小(或最大)的元素与待排序元素比较。要理解堆排序,需要先了解什么是堆,以及如何将一组数变成堆。

2. 简单选择排序

2.1基本思路

太简单,主要分为两步,一选择,二比较、交换。

2.2 示意图

这里写图片描述

2.3 算法实现

从小到大排序

public static void simpleSelectionSort(int[] a ){    for(int i=0; i<a.length; i++){        int temp = a[i+1];    //temp用于存储a[i]后的最小值        for(int j=i+2;j<a.length;j++){            if(a[j]<temp){                temp = a[j];            }          }        if(a[i]>temp){            a[i] = temp;        }    }}                  

3. 堆排序

3.1 背景介绍

3.1.1 什么是堆?

堆的定义:具有n个元素的序列(k1,k2,k3,……kn),当且仅当满足
这里写图片描述这里写图片描述 (i=1,2,3,……,⌊n/2⌋)成为堆。

3.1.2 如何创建堆?

1.找到最后一个有孩子的节点的位置,将父节点的值调整为父节点、左右孩子的最小值。
2.其他节点依次进行

3.2 基本思路

1.输出堆顶元素,然后将堆底元素送入对顶,堆被破坏;
2.将根节点与左右子数较小的元素交换,以此类推

3.3 算法实现

从小到大排序

public static void heapSort(int[] a){    buildHeap(a);//初始堆    for(int i=a.length-1; i>0; i--){        int temp = a[i];        a[i] = a[0];        a[0] = temp;        heapAdjust(a, 0, i);    }}public static void buildHeap(int[] a){    //最有一个有孩子的节点的位置 i= a.length/2-1    for(int i=(a.length/2)-1); i>=0; i--){        heapAdjust(a, i, a.length);    }}public static void heapAdjust(int[] a, int s, int length){    int child = 2*s +1; //child 为左孩子    while (child<length){        if(child+1<length && a[child]<a[child+1]){            ++child;    //a[child] 为较大的孩子        }         if(a[s]<a[child]){            a[s]= a[child];            s= child;            child=2*s+1;        }        }}                            

4. 总结

选择排序的过程都是在某个范围内选取最大或最小的值,然后与某个值进行比较交换。堆排序看上去略复杂,但重点在heapAdjust()方法,梳理一下思路就很简单。

0 0