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次,基于终于的排序时间是比較与交换的次数总和,因此,总的时间复杂度依旧为。

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

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



  • 相关阅读:
    编程小技巧之 Linux 文本处理命令(二)
    基金投资经验总结
    基金投资需要掌握的几个基本概念
    动目标指示MTI和动目标检测MTD
    雷达信号处理基础-快时间维和慢时间维
    信号处理第二篇——接着谈正弦信号
    毫米波雷达第一篇——测距篇
    信号处理第一篇——浅谈正弦信号
    python学习总结篇(3)——类
    python中的if __name__ == '__main__' 如何正确理解?
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6751637.html
Copyright © 2011-2022 走看看