您的位置:首页 > 其它

基础之路01,选择排序不就是跳了中间交换步骤的冒泡排序嘛

2017-01-17 20:25 274 查看
今天开始正式学习,于是了解了一下冒泡排序和选择排序,想了一下,其实选择排序就相当于把中间一步步的交换省掉了的冒泡排序。为了方便描述,这里求的是从小到大的排序,有N个元素需要排序,使用语言C语言。

冒泡是从第一个或最后一个数开始计顺序,依次比较按顺序相邻的元素的大小,如果不符合我们要求的大小顺序则交换,这样我们先将全体元素依次比较交换一轮,会使得最大的那个元素的位置处在最右端(当然也可以让最小的元素位置处在最左端,过程是类似的)。于是下一轮我们只需要再将剩下的N-1个元素再来一次依次比较交换,就又把在N-1个 元素里面最大的那个数放在了第N-1的位置(或者把N-1个元素里面最小的那个放在第二个位置)。这样子我们继续,进行N-1轮比较交换,即可将全体N个元素排好顺序。代码如下,其中#include<time.h>是为了便于得到程序实际运行时间,以比较不同算法的实际时间开销。

冒泡排序的代码及结果如下

#include<stdio.h>

#include<time.h>

#define MAX_NUM 10

void main(){
long op,ed;
op=clock();
int i,j,c;
int an[MAX_NUM];
for(i=0;i<MAX_NUM;i++){
scanf("%d",&an[i]);
}
for(j=MAX_NUM-1;j>0;j--){
for(i=0;i<j;i++){
if(an[i]>an[i+1]){

c=an[i];
an[i]=an[i+1];
an[i+1]=c;
}
}
}
for(i=0;i<MAX_NUM;i++){
printf("%d\n",an[i]);
}
ed=clock();
printf("%ldms\n",ed-op);
while(1){}

}



而选择排序,则是没有依次比较相邻元素的大小关系再进行交换这一步骤,选择排序是直接依次将位置定住,再将余下所有元素与该位置比较大小,若大小关系不符合要求顺序则交换。这样子就直接跳过了一步步交换到端的过程,而是直接交换到端。比如我们从数组下标0开始,将数组下标1到N-1的所有元素都与数组下标为0的元素比较大小,若不符合要求则交换。这样子最后我们就可以将N个元素当中最小的那个放置到数组下标为0的地方,然后我们可以继续再从数组下标为1开始,比较数组下标为1的元素和下标为2到N-1的各个元素的大小关系,并且这样得到的数组下标为1的位置的元素自然是要比数组下标为0的位置要小的,即前面的部分已经排好了序。这样经过N-1轮比较,我们也得到了从小到大的排序结果。并且很显然这样的程序运行步骤中的交换步骤比冒泡里面的一步步相邻交换要少,即一般情况下时间开销要比冒泡排序少,虽然它们都可以看成两个循环嵌套,复杂度O(N^2)。

选择排序的代码及结果如下,输入和冒泡保持一致

#include<stdio.h>

#include<time.h>

#define MAX_NUM 10

void main(){
long op,ed;
op=clock();
int i,j;
int an[MAX_NUM];
for(i=0;i<MAX_NUM;i++){
scanf("%d",&an[i]); }
for(i=0;i<MAX_NUM-1;i++){
int nTmpMin=i;
for(j=i;j<MAX_NUM;j++){
if(an[j]<an[nTmpMin]){
nTmpMin=j;
}

}
int nTmp=an[i];
an[i]=an[nTmpMin];
an[nTmpMin]=nTmp;
}

    
printf("下面是排序输出结果:\n");
for(i=0;i<MAX_NUM;i++){
printf("%d\n",an[i]);
}
ed=clock();
printf("%ldms\n",ed-op);
while(1){}

}



2017-1-17日
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: