数列排序算法——冒泡排序算法和选择排序算法

大二学过一学期的数据结构,对一些数列排序算法有一些了解,但是每当遇到排序的时候就不由自主的拿起书来看,很明显还是掌握的不扎实,因此今天准备把这两个简单的排序算法进行一次彻底的分析,也当做复习了,小编先来说说冒泡算法。(注意:后面的排序都为升序)。

冒泡算法是一个由后向前的排序算法,是一个利用二层嵌套循环完成的排序算法。

其过程可叙述为:1.从数列的第一个数字和第二个数字开始,两两比较相邻数字的大小,若前面的数字比后面的数字大,则交换两字数字的位置,直至序列的最后一个元素也进行了比较。2.经过一次的比较,最后的数字一定是数列中最大的数字,因此如此以往,对所有的数字做这样的循环,最后将会使序列拍成升序序列。

改进:1.因为每拍完一次,会增加一个有序状态的数字,因此,内层嵌套的循环条件为j<n-i-1;2.序列有时会出现这样的情况:后面的几个数字已经成有序状态,而且前面的数字也已经成为了有序状态,但是按照程序运行,还会进行一些不必要的比较工作,这样使程序增加了很多不必要的计算,此时增加一个flag标记用作检验序列的状态,若已经完全有序则退出循环即可。代码如下:

#include<stdio.h>
#include<stdlib.h>
int main(){
int i,j,flag = 0,temp;
int arr[200];
int n;
scanf("%d",&n);
for(i = 0;i<n;i++){
scanf("%d",&arr[i]);
}
for(i = 0;i<n-1;i++){
flag = 0;
for(j = 0;j<n-i-1;j++){
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 1;
}
if(flag == 0){
break;
}

}
}
printf("\n");
for(i = 0;i<n;i++){
printf("%d",arr[i]);

return 0;
}

选择排序是一个容易理解的排序方法,它是默认一个值为最小值,然后与序列后面的值进行依次比较,如果有比最小值小的数,则更新最小值为对应的数字,一般使用传递下标的方法来达到数字传递的目的。代码如下:

#include<stdio.h>
int main(){
int arr_number[200];
int n,i,j,k,temp;
scanf("%d",&n);
for(i = 0;i<n;i++){
scanf("%d",&arr_number[i]);
}
for(i = 0;i<n-1;i++){
k = i;
for(j = i+1;j<n;j++){
if(arr_number[j]<arr_number[k]){
k = j;
}
}
if(k != i){
temp = arr_number[i];
arr_number[i] = arr_number[k];
arr_number[k] = temp;
}
}
for(i = 0;i<n;i++){
if(i!=n-1)
printf("%d ",arr_number[i]);
else
printf("%d",arr_number[i]);
}
return 0;
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值