`
chenzehe
  • 浏览: 532983 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

选择排序算法分析及程序示例

阅读更多
实例说明
  用直接选择排序方法对数组进行排序。

实例解析

  选择排序( 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实现的选择排序算法,结合实例形式分析了Python选择排序的概念、原理及简单实现技巧,需要的朋友可以参考下

    数据结构与算法分析

     本书是数据结构和算法分析的经典教材,书中使用主流的程序设计语言C++作为具体的实现语言。书的内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找...

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

     2.6 算法分析示例  2.7 保证、预测及局限性 第二部分 数据结构  第3章 基本数据结构  3.1 构建组件  3.2 数组  3.3 链表  3.4 链表的基本处理操作  3.5 链表的内存分配  3.6 字符串  3.7 复合...

    数据结构与排序算法------通过代码示例,讲解:数据结构和9种排序算法。.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    数据结构与算法程序示例。常用算法思想总结归档。使知识体系化.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    PHP四种基本排序算法示例

    但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路。 前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序...

    《数据结构与算法分析》.txt

    求学的三个条件是:多观察、多吃苦、多研究。——加菲劳 《数据结构与算法分析...《数据结构与算法分析》 课程实践内容体系主要内容 实践教学单元模块 实践教学基本要求 实践教学具体内容 趣味程序设计实践 1.熟悉编程

    基于java语言的数据结构及算法实现,LeetCode算法示例.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    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 ...

    数据结构与算法示例.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    CS-261-Assignment-1:各种排序算法的示例

    CS-261-Assignment-1 ...作业说明:这项作业是为了对algorihms类进行分析,因此,按预期,第一个作业是对4种不同的排序算法(例如合并排序和冒泡排序)进行最终化。 用c编写的4种不同的排序程序。 程序示例运行:

    数据结构与算法(C++语言描述)

    本书讨论算法分析和算法设计策略,讨论搜索和排序算法的时间下界,还介绍了随机算法以及NP难度和NP完全问题。  全书条理清晰,内容翔实。书中算法都有完整的C++程序,程序结构清晰,构思精巧,既是读者学习数据结构...

    学习数据结构与算法的代码示例,目前提供 Java、Python、Go、C++ 多种语言支持。.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    Java 核心类的示例、 部分工具类、 数据结构和算法.zip

    算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法...

    大数据算法视频课程+课件

    外存算法示例:外存排序算法 外存数据结构示例:外存查找树 第5章 外存查找结构 B树 KD树 第6章 外存图数据算法 表排序及其应用 时间前向处理方法 缩图法 第7章 基于MapReduce的并行算法设计 MapReduce概述 字数...

    《算法》中文版,Robert Sedgewick,塞奇威克

    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 ...

    C++数据结构与算法

    第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 邻接链表 ...

    程序设计抽象思想:C语言描述-

     7.5 快速排序算法  7.6 数学归纳法  7.7 小结  7.8 复习题  7.9 编程练习  第Ⅲ部分 数据抽象  第8章 抽象数据类型  ……  第9章 效率与ADT  第10章 线性结构  第11章 符号表  第Ⅳ部分 递归数据  第...

Global site tag (gtag.js) - Google Analytics