基础之路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日
冒泡是从第一个或最后一个数开始计顺序,依次比较按顺序相邻的元素的大小,如果不符合我们要求的大小顺序则交换,这样我们先将全体元素依次比较交换一轮,会使得最大的那个元素的位置处在最右端(当然也可以让最小的元素位置处在最左端,过程是类似的)。于是下一轮我们只需要再将剩下的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日
相关文章推荐
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)
- 黑马程序员_java基础学习笔记之排序算法(选择排序、冒泡排序
- java基础之----选择排序 冒泡排序
- 【基础算法】选择排序与冒泡排序
- java基础之选择排序和冒泡排序
- 黑马程序员——c语言基础:冒泡排序、选择排序和折半查找
- Java基础---选择排序和冒泡排序
- 【java基础】选择排序and冒泡排序
- JAVA基础再回首(十一)——数组高级(冒泡排序和选择排序)、Arrays类、基本类型包装类、Integer类
- Java基础04:选择排序;冒泡排序;折半查找;二位数组
- 四基础排序算法:插入排序、选择排序、冒泡排序、快速排序
- 数据结构之基础排序(选择排序、插入排序、冒泡排序)
- 【java基础】选择排序and冒泡排序
- 基础排序——冒泡排序、选择排序、插入排序的讲解、代码实现
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- 三种最简单基础的排序 选择排序 冒泡排序 直接插入排序 运用了函数指针数组
- 算法效率的分析--【以选择排序与冒泡排序为基础】
- 基础算法(一):选择排序和冒泡排序
- 交换排序:冒泡排序、选择排序【排序算法】
- 黑马程序员_C语言基础_数组之冒泡排序、快速选择排序、折半查找