周立功:选择排序不妨这样试一下

Posted ZLG致远电子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了周立功:选择排序不妨这样试一下相关的知识,希望对你有一定的参考价值。


第一章为程序设计基础,本文为1.6.3泛型编程第三点:选择排序。


>>>> 3.  选择排序


假设要对n个整数排序,这里给出一个简单的抽象解决方案,其文本描述如下:


从未被排序的整数中找出最小的整数,将其放在已经排序的整数列表中的下一个位置。


虽然这句话足以描述如何解决这个排序问题,但还没有说明这些整数初始化时存储在哪里?如何存储?结果存储在哪里?假设将这些整数存储在一个数组中:


data[] = {56, 12, 80, 91, 20}; 


其中,第i个整数存储在数组的第i个位置data[i]中(0≤i≤n)。


首先,需要明确定义两个任务:


(1)如何在列表中寻找最小整数;


(2)如何将这个最小整数与data[i]进行交换。  我们不妨从i=0开始进行分析,最小整数就存储在data[i]中,当将min设置为0时,则下一个元素位置为j=i+1=1。如果data[min]>data[j],则min=j,反之data[min]与data[j]交换位置。推而广之,当将data[i]与data[i+1]、data[i+2]、......、data[n-1]一一进行比较时,如果发现更小的整数,则将其作为新的最小整数,一直比较到data[n-1]时结束。选择排序的共性如下:


1     for(int i =0; i < n-1; i++){ 

2            min = i; 

3            for(int j = i+1; j < n; j++) 

4                   if(data[min] > data[j]) 

5                          min = j; 

6            swap(&data[min], &data[j]); 

7     } 


选择排序中可变的是存储在数组中的待比较的整数,将以形参应对,其函数原型如下:


void selectionSort(int data[], size_t size); 

// 前置条件:data是一个至少有sizie个元素的数组

// 后置条件:数组元素重新排序,使得data[0]≥data[1]≥...≥data[size-1] 

void selectionSort(int *data, size_t size); 


虽然选择上述两种声明中的任何一种方式都可以实现选择排序,但都是针对数组的排序,无法满足一般的要求。基于此,可以进一步泛化使之应用应更广泛。其函数原型如下:


void selectionSort(int *begin, int *end); 


其调用形式如下:


selectionSort(data, data+sizeof(data)/sizeof(data[0])); 


显然,无论是选择排序、冒泡排序、插入排序和快速排序等,其共性都是“排序”,因此可以统一各种排序算法的接口,便于根据具体情况重用,而又无需修改应用程序。



延伸阅读














以上是关于周立功:选择排序不妨这样试一下的主要内容,如果未能解决你的问题,请参考以下文章

USBCAN-II由USB口连后电脑,用周立功测试软件CANtest.exe,一直是“打开设备失败”,这是怎么了?

数据结构选择排序

Java 选择排序算法

Java 选择排序算法

对于近似有序序列(即除掉少数K个元素后是有序序列且K<<n),试分析直接插入排序,冒牌排序和简单选择排序的时间复杂度

经典排序算法——选择排序