选择类排序包括:

(1)  简单选择排序

(2)树形选择排序

(3)堆排序

简单选择排序:

【算法思想】:在第 i 趟简单选择排序中,从第 i 个记录开始,通过 n - i 次关键字比较,从 n - i + 1 个记录中选出关键字最小的记录,并和第 i 个记录进行交换

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

 //此函数中a[0]不用,即对 a[1] ~ a[length-1] 排序;
//如果对a[0]~a[length-1]排序,将 for 循环中的 i = 1 改为 i = 0 即可,注意输出
void select(int a[],int length){//length为数组的长度
int i,j;
int min;//记录最小值的位置 for(i = ;i < length - ;i++){
min = i;
//选择最小的值
for(j = i + ;j < length;j++){
if(a[j] < a[min]) //更新最小值的坐标
min = j;
}
if(min != i){
int temp;
temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
}

堆排序:

堆排序是威洛母斯在1964年提出的对树形选择排序的改进算法,其只需要一个记录大小的辅助空间,采用向量数组方式存储,采用完全二叉树的顺序结构的特征进行分析,而非采用树的存储结构。

从小到大排序采用大根(顶)堆:r[i].key >= r[2i].key && r[i].key >= r[2i+1].key (结点值大于等于其左子与右子)

从大到小排序采用小根(顶)堆:r[i].key <= r[2i].key && r[i].key<= r[2i+1].key (结点值小于等于其左子与右子)

【算法思想】把待排序的记录的关键字存放在数组 r[1...n] 中,将 r 看成一棵完全二叉树的顺序表示,每个结点表示一个记录,第一个记录 r[1] 作为二叉树的根,以下各记录 r[2] ~ r[n] 依次逐层从左到右顺序排列,任意结点 r[i] 的左孩子是 r[2i] ,右孩子是 r[2i+1],双亲是 r[i/2]。对这棵二叉树进行调整建堆。

时间复杂度:O(nlog2n)

  说明:在c语言中,i/2 的含义是整除,不同于数学中的定义,即 3/2 = 1,有一个向下取整的意思

堆排序可分为2步(从小到大排序):

<1> 建初堆:建立一个大根堆

<2>重建堆:进行 n - 1 趟的交换(r[1] 与 堆尾进行交换)和建堆的过程

 /*堆排序*/
/*建初堆:大根堆*/
void AdjustDown(int a[],int k,int len);
void BuildMaxHeap(int a[],int len){
int i;
for(i = len/;i > ;i--){
AdjustDown(a,i,len);
}
}
//调整堆
void AdjustDown(int a[],int k,int len){
a[] = a[k];//将第一个记录移出
int i;
for(i = *k;i <= len;i = *i){
if(i < len && a[i] < a[i+])//不能忘记i < len,否则会超出范围
i++;//取左右子中的最大值
if(a[] >= a[i])
break;
else{
a[k] = a[i]; //将a[i]调整到其双亲结点上
k = i; //修改k值,以便继续向下筛选
}
}
a[k] = a[];
} void HeapSort(int a[],int len){
BuildMaxHeap(a,len);
int i;
int temp;
for(i = len;i > ;i--){
//第一个和堆尾进行交换
temp = a[];
a[] = a[i];
a[i] = temp;
//调整堆
AdjustDown(a,,i-);
}
}

图可参照:https://blog.csdn.net/u013384984/article/details/79496052

测试:

 int main(){
int a[] = {-,,,,,,,,,,};
int b[] = {-,,,,,,,,,,};
int i,j;
select(a,); //没有用a[0],对后面的元素进行排序
HeapSort(b,);//数组的最后一个下标,a[0]为辅助单元
for ( i = ;i < ;i++){
printf("%d \t",a[i]);
}
printf("\n"); for ( i = ;i < ;i++){
printf("%d \t",b[i]);
}
printf("\n");
}

选择类排序 (简单选择排序,堆排序)— c语言实现的更多相关文章

  1. 选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  2. 选择排序—简单选择排序(Simple Selection Sort)原理以及Java实现

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  3. 9, java数据结构和算法: 直接插入排序, 希尔排序, 简单选择排序, 堆排序, 冒泡排序,快速排序, 归并排序, 基数排序的分析和代码实现

    内部排序: 就是使用内存空间来排序 外部排序: 就是数据量很大,需要借助外部存储(文件)来排序. 直接上代码: package com.lvcai; public class Sort { publi ...

  4. 八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  5. 内部排序->选择排序->简单选择排序

    文字描述 简单排序的基本思想是:每一趟在n-i+1(i=1,2,…,n)个记录中选取关键字最小的记录作为有序列表中的第i个记录. 示意图 略 算法分析 简单排序算法中,所需进行记录移动的操作次数较少, ...

  6. Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)

    目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...

  7. 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现

    今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...

  8. 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)

    程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...

  9. 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort

    选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...

随机推荐

  1. speedscope + node inspect 分析node应用调用

    生成一个简单的express 项目 使用脚手架工具 npm install -g express-generator@4 express . 启动使用inspect命令 node --inspect ...

  2. ABP 02 解决 界面为英文

    原文:https://www.cnblogs.com/wswind/p/10313968.html 1.直接改数据库 2.在数据迁移前,更改默认值 注意: 我的项目已经初始化了,数据库已经都生成好了, ...

  3. GoCN每日新闻(2019-11-04)

    GoCN每日新闻(2019-11-04) GoCN每日新闻(2019-11-04)   1. Go中垃圾收集器是如何标记内存的 https://medium.com/a-journey-with-go ...

  4. Java动态代理实现方式一

    Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理 实现方式一:静态代理 静态代理方式的优点 静态代理方式的缺点 Java动态代理实现方式一:InvocationHandler Ja ...

  5. bzoj 3585 mex - 线段树 - 分块 - 莫队算法

    Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...

  6. “未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

    一.背景: 开发一个工具的小项目,因为数据少,我就不想安装sqlserver数据库,就用Access数据库. 二.问题: 在客户安装程序的时候,接口访问Access数据库的时候,报错“未在本地计算机上 ...

  7. 【Gamma阶段】第一次Scrum Meeting

    冰多多团队-Gamma阶段第一次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 卓培锦 推广软件,发放调查问卷 修改可移动button以及button手感反馈优化,编辑器风格切换(夜间模式 ...

  8. enable device: BAR 0 [mem 0x00000000-0x003fffff] not claimed

    /******************************************************************************* * enable device: BA ...

  9. Metasploit使用内网跳板, 扫描局域网主机

    最近,拿到一台内网机器, 苦于无法使用nmap扫描改主机的内网, 所以才有此文 在跳板机子获取一定权限后,需要积极的向内网主机权限发展,获取指定的目标信息,探查系统漏洞,借助msf已经得到的meter ...

  10. Android: NDK中的Android.mk和Application.mk

    1. 简介 Android.mk  可用来描述要编译的某个具体模块的相关信息.比如:指定编译该模块时所需要的源文件.编译该模块时要链接的库文件.该模块编译完成后生成的库的名字等等.Applicatio ...