实例说明
用直接选择排序方法对数组进行排序。
实例解析
选择排序( Selection Sort )的基本思想是:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
常用的选择排序方法有直接选择排序和堆排序。
直接选择排序( Straight Selection Sort )
直接选择排序的基本思想是 n 个记录的文件的直接选择排序可经过 n-1 趟直接选择排序得到有序结果。
① 初始状态:无序区为 R[1..n] ,有序区为空。
② 第 1 趟排序
在无序区 R[1..n] 中选出关键字最小的记录 R[k], 将它与无序区的第 1 个记录 R[1] 交换,使 R[1..1] 和 R[2..n] 分别变为记录个数增加 1 个的新有序区和记录个数减少 1 个的新无序区。
③ 第 I 趟排序
第 I 趟排序开始时,当前有序区和无序区分别为 R[1..i-1] 和 R[i..n](1 ≤ I ≤ n-1) 。该趟排序从当前无序区中选出关键字最小的记录 R[k], 将它与无序区的第 1 个记录 R[i] 交换,使 R[1..i] 和 R[i+1..n] 分别变为记录个数增加 1 个的新有序区和记录个数减少 1 个的新无序区。
这样, n 个记录的文件的直接选择排序即可经过 n-1 趟直接选择排序得到有序结果。
直接选择排序的具体算法如下:
void SelectSort(SeqList R){
int I,j,k;
for(i=1;i<n;i++){ // 做第 I 趟排序 (1 ≤ I ≤ n-1)
k=I;
for(j=i+1;j<=n;j++) // 在当前无序区 R[i..n] 中选 key 最小的记录 R[k]
if(R[j].key<R[k].key)
k=j; // k 记下目前找到的最小关键字所在的位置
if(k!=i){ // 交换 R[i] 和 R[k]
R[0]=R[i];R[i]=R[k];R[k]=R[0]; // R[0] 做暂存单元
}//endif
}//endfor
}//SelectSort
程序代码—直接选择排序
#include <stdio.h>
#define MAX 255
int R[MAX];
void Select_Sort(int n){
int i,j,k;
for(i=1;i<n;i++){ /* 做第 I 趟排序 (1 ≤ I ≤ n-1) */
k=i;
for(j=i+1;j<=n;j++) /*在当前无序区R[i..n] 中选 key 最小的记录 R[k] */
if(R[j]<R[k])
k=j; /* k 记下目前找到的最小关键字所在的位置 */
if(k!=i){ /* 交换 R[i] 和 R[k] */
R[0]=R[i];R[i]=R[k];R[k]=R[0]; /* R[0] 做暂存单元 */
}/* endif */
}/* endfor */
}/* end of Select_Sort */
void main(){
int i,n;
clrscr();
puts("Please input total element number of the sequence:");
scanf("%d",&n);
if(n<=0 || n>MAX){
printf("n must more than 0 and less than %d.\n",MAX);
exit(0);
}
puts("Please input the elements one by one:");
for(i=1;i<=n;i++)
scanf("%d",&R[i]);
puts("The sequence you input is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
Select_Sort(n);
puts("\nThe sequence after select_sort is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
puts("\n Press any key to quit…");
getch();
}
归纳注释
关键字比较次数:无论文件初始状态如何,在第 I 趟排序中选出最小关键字的记录,需做 n-I 次比较,因此,总的比较次数为 n(n-1)/2=O(n^2 )。
记录的移动次数:当初始文件为正序时,移动次数为 0。文件初态为反序时,每趟排序均要执行交换操作,总的移动次数取最大值 3(n-1)。直接选择排序的平均时间复杂度为 O(n^2 )。
直接选择排序是一个就地排序。
稳定性分析:直接选择排序是不稳定的,反例比如 [2,2,1]。
分享到:
相关推荐
主要介绍了Python实现的选择排序算法,结合实例形式分析了Python选择排序的概念、原理及简单实现技巧,需要的朋友可以参考下
本书是数据结构和算法分析的经典教材,书中使用主流的程序设计语言C++作为具体的实现语言。书的内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找...
2.6 算法分析示例 2.7 保证、预测及局限性 第二部分 数据结构 第3章 基本数据结构 3.1 构建组件 3.2 数组 3.3 链表 3.4 链表的基本处理操作 3.5 链表的内存分配 3.6 字符串 3.7 复合...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路。 前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序...
求学的三个条件是:多观察、多吃苦、多研究。——加菲劳 《数据结构与算法分析...《数据结构与算法分析》 课程实践内容体系主要内容 实践教学单元模块 实践教学基本要求 实践教学具体内容 趣味程序设计实践 1.熟悉编程
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
4.3.2 选择排序算法示例 105 4.4 插入排序法 107 4.4.1 插入排序算法 107 4.4.2 插入排序算法示例 108 4.5 Shell排序法 110 4.5.1 Shell排序算法 110 4.5.2 Shell排序算法示例 111 4.6 快速排序法 113 ...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
CS-261-Assignment-1 ...作业说明:这项作业是为了对algorihms类进行分析,因此,按预期,第一个作业是对4种不同的排序算法(例如合并排序和冒泡排序)进行最终化。 用c编写的4种不同的排序程序。 程序示例运行:
本书讨论算法分析和算法设计策略,讨论搜索和排序算法的时间下界,还介绍了随机算法以及NP难度和NP完全问题。 全书条理清晰,内容翔实。书中算法都有完整的C++程序,程序结构清晰,构思精巧,既是读者学习数据结构...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...
外存算法示例:外存排序算法 外存数据结构示例:外存查找树 第5章 外存查找结构 B树 KD树 第6章 外存图数据算法 表排序及其应用 时间前向处理方法 缩图法 第7章 基于MapReduce的并行算法设计 MapReduce概述 字数...
5.1.5 字符串排序算法的选择 5.2 单词查找树 5.2.1 单词查找树 5.2.2 单词查找树的性质 5.2.3 三向单词查找树 5.2.4 三向单词查找树的性质 5.2.5 应该使用字符串符号表的哪种实现 5.3 子字符串查找 5.3.1 ...
第1章 C++面向对象程序设计 1.1 抽象数据类型 1.2 封装 1.3 继承 1.4 指针 1.4.1 指针与数组 1.4.2 指针与复制构造函数 1.4.3 指针与析构函数 1.4.4 指针和引用变量 1.4.5 函数指针 1.5 多态性 ...
6.7 二叉树的建立和遍历C语言源程序示例 习题六 第7章 图 7.1 图的基本概念和术语 7.1.1 图的基本概念 7.1.2 路径和回路 7.1.3 连通图 7.1.4 顶点的度 7.2 图的存储结构 7.2.1 邻接矩阵 7.2.2 邻接链表 ...
7.5 快速排序算法 7.6 数学归纳法 7.7 小结 7.8 复习题 7.9 编程练习 第Ⅲ部分 数据抽象 第8章 抽象数据类型 …… 第9章 效率与ADT 第10章 线性结构 第11章 符号表 第Ⅳ部分 递归数据 第...