zoukankan      html  css  js  c++  java
  • 简单选择排序(Simple Selection Sort)

    基本思想:排序时找到合适的keyword再做交换,而且仅仅移动一次就完毕对应keyword的排序定位工作。即通过n-i次keyword间的比較,从n-i+1(i=1,2,...n-1)个记录中选出keyword最小的记录,并和第i(1<=i<=n)个记录交换之。

    void SelectSort(SqList *L);
    实现代码例如以下:

    // test.cpp : 定义控制台应用程序的入口点。

    // #include "stdafx.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; #define MAXSIZE 10000 /* 用于要排序数组个数最大值。可依据须要改动 */ typedef struct { int r[MAXSIZE+1]; /* 用于存储要排序数组,r[0]用作哨兵或暂时变量 */ int length; /* 用于记录顺序表的长度 */ }SqList; void print(SqList L) { int i; for(i=1;i<L.length;i++) printf("%d,",L.r[i]); printf("%d",L.r[i]); printf(" "); } /* 交换L中数组r的下标为i和j的值 */ void swap(SqList *L,int i,int j) { int temp=L->r[i]; L->r[i]=L->r[j]; L->r[j]=temp; } /* 对顺序表L作简单选择排序 */ void SelectSort(SqList *L) { int i,j,min; for(i=1;i<L->length;i++) { min = i; /* 将当前下标定义为最小值下标 */ for (j = i+1;j<=L->length;j++)/* 循环之后的数据 */ { if (L->r[min]>L->r[j]) /* 假设有小于当前最小值的keyword */ min = j; /* 将此keyword的下标赋值给min */ } if(i!=min) /* 若min不等于i,说明找到最小值。交换 */ swap(L,i,min); /* 交换L->r[i]与L->r[min]的值 */ } } #define N 9 int _tmain(int argc, _TCHAR* argv[]) { int d[N]={9,1,5,8,3,7,4,6,2}; SqList L0; int i; for(i=0;i<N;i++) L0.r[i+1]=d[i]; L0.length=N; printf("排序前: "); print(L0); SelectSort(&L0); printf("排序后: "); print(L0); getchar(); return 0; }

        从简单选择排序的过程来看,它最大的特点就是交换移动数据次数相当少,这样也就节约了对应的时间。分析它的时间复杂度发现,不管最好最差的情况,其比較次数都是一样的多,第i趟排序须要进行n-i次keyword的比較。

    此时须要比較次。而对于交换次数而言,当最好的时候,交换为0次,最差的时候,也就初始降序时。交换次数为n-1次,基于终于的排序时间是比較与交换的次数总和,因此,总的时间复杂度依旧为。

        应该说,虽然与冒泡排序同为。

    但简单选择排序的性能上还是要略优于冒泡排序。



  • 相关阅读:
    Helpers Overview
    Validation
    Support Facades
    Session Store
    位运算(参考百科)
    开源项目_可能使用到的开源项目集合
    秒杀系统架构分析与实战(转)
    shell命令之根据字符串查询文件对应行记录
    MySQL做为手动开启事务用法
    spring 加载bean过程源码简易解剖(转载)
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6751637.html
Copyright © 2011-2022 走看看