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

  每次 从待排序序列中选择出一个最大(或者最小)的记录添加到有序序列的后面即为选择排序。

  选择排序主要有:简单选择排序树形选择排序堆排序

1、简单选择排序

 基本思路:重复进行n趟选择,第i趟通过n-i次记录的比较,在n-i+1个记录中选取最小(或最大)的记录与第i个记录进行交换。

void selectSort(int arr[],int n){
    int outer,inner;
    int min;
    for(outer=1;outer<=n;outer++ ){
        min = outer;
        for(inner=outer;inner<=n;inner++)
          if(arr[inner]<arr[min])
            min = inner;
        if(min != outer){
            arr[0] = arr[min];
            arr[min] = arr[outer];
            arr[outer] = arr[0];
        }

    }
}

2、堆排序

 堆:(1) 堆是完全二叉树;

  (2) 小根堆:每个结点的值小于等于左右孩子结点的值;大根堆:每个结点的值大于等于左右孩子结点的值。

堆排序:对于大根堆来说,堆顶记录即是整个序列的最大值。我们将待排序序列构造成一个堆,选出堆顶记录(最大值),然后把剩下的记录重新调整成堆,再选择出堆顶记录(次大值),依次下去,直到堆中只剩下一个记录。

void shiftHeap(int arr[],int k,int m){
    int i = k;
    int j = i * 2;
    while(j <= m){
        if(j<m && arr[j]<arr[j+1]) j++;
        if(arr[i]>arr[j]) 
          break;
        else{
            arr[0] = arr[i];
            arr[i] = arr[j];
            i = j;
            j = 2 * i;
        }
    }
}

void heapSort(int arr[],int n){
    int index;
    for(index = n/2;index>=1;index--)
      shiftHeap(arr,index,n);
    for(index=1;index<n;index++){
        arr[0] = arr[1];
        arr[1] = arr[n-index+1];
        arr[n-index+1] = arr[0];
        shiftHeap(arr,1,n-index);
    }
}

3、总结

简单选择排序:时间复杂度为o(n2),是不稳定排序。

堆排序:时间复杂度为o(nlog2n),是不稳定排序。

堆排序其实就是每次选择待排序序列中的最大值(或最小),它与简单选择排序的区别就是:简单选择排序是通过比较n-i+1个记录来选择最值,而堆排序是通过构造堆来选择最值。所以堆排序最重要的就是调整成堆的过程。

原文地址:https://www.cnblogs.com/whc-uestc/p/4458405.html