大二学过一学期的数据结构,对一些数列排序算法有一些了解,但是每当遇到排序的时候就不由自主的拿起书来看,很明显还是掌握的不扎实,因此今天准备把这两个简单的排序算法进行一次彻底的分析,也当做复习了,小编先来说说冒泡算法。(注意:后面的排序都为升序)。
冒泡算法是一个由后向前的排序算法,是一个利用二层嵌套循环完成的排序算法。
其过程可叙述为: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;
}