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

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

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

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个记录来选择最值,而堆排序是通过构造堆来选择最值。所以堆排序最重要的就是调整成堆的过程。

posted @   牛逼的码农  阅读(239)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示