目录
1. 什么是交换排序
所谓交换,就是你输入了一组数据后,通过两两比较进行对换这两个数据在记录中的位置。
2. 什么是冒泡排序
冒泡排序是一种基本的交换排序,同时冒泡排序的算法也算是比较简单的。
冒泡排序的基本思想:从后往前,或从前往后两两比较相邻元素的值,如果你想要是降序
(即a[i]<a[i+1])交换它们,直到序列比较完;如果你想要的是升序(即a[i]>a[i+1])交换它们,直到序列比较完。
我们用数据进行说明描述:
假如我们输入了6个数据是:1,6,10,23,4,2 并且我们想要一个升序,由小到大
a. 1 6 10 23 4 2
1是第一个元素,我们从前往后两两比较
1<6所以不交换;
6<10所以不交换;
10<23所以不交换;
23>4所以交换,也就是a[3]和a[4]所对应的元素进行交换——此时序列变成了1,6,10,4,23,2;
23>2进行交换,也就是a[4]和a[5]所对应的元素进行交换(提示:此时a[4]的元素不是4了,而是23)——此时的序列变成了1,6,10,4,2,23
第一轮循环结束!循环了1次,比较了5次,移动了2次。
b. 1 6 10 4 2 23
1<6所以不交换;
6<10所以不交换;
10>4所以交换......
10>2所以交换......
10<23所以交换......
——此时的序列变成了1,6,4,2,10,23
第二轮循环结束!循环了1次,比较了5次,移动了3次
我们通过两轮推理,已经可以看出了冒泡排序算法的规律,最终我们会循环5次,如果我们输入的是n个数据,最终我们会循环n-1次,比较次数n(n-1)/2,移动次数3n(n-1)/2。
最好情况:当初始序列为有序的时候,只需要循环n-1次,时间复杂度为O(n)。
最坏情况:时间复杂度O(n2),空间复杂度O(n2)。
3. 冒泡排序算法的代码
void BubbleSort(ELemType A[],int n){
for(int i=0;i<n-1;i++){
bool flag=false; //表示本趟冒泡是否发生交换的标志
for(int j=n-1;j>i;j--)//一趟冒泡过程
if(A[j-1]>A[j]){ //若为逆序
swap(A[j-1],A[j]);//交换
flag=true;
}
if(flag=flase)
return; //本趟遍历后没有发生交换,说明表已经有序
}
}
}
4. 有关排序的简单例题
a. 编写一个函数—将数组从大到小进行排序
#include<stdio.h>
int main(){
int bts[10];
int i,j,t;
printf("分别输入10个数:\n");
for(i=0;i<10;i++)
scanf("%d",&bts[i]);
printf("\n");
for(j=0;j<9;j++)
for(i=0;i<9-j;i++) //从前往后遍历比较
if(bts[i]<bts[i+1]){
t=bts[i];
bts[i]=bts[i+1];
bts[i+1]=t;
}
printf("该10个数由大到小排序:\n");
for(i=0;i<10;i++)
printf("%d ",bts[i]);
return 0;
}
b. 有10各地区的面积,要求按照由小到大的顺序排列
#include<stdio.h>
int main(){
int bts[10];
int i,j,t;
printf("分别输入10个地区的面积:\n");
for(i=0;i<10;i++)
scanf("%d",&bts[i]);
printf("\n");
for(j=0;j<9;j++)
for(i=0;i<9-j;i++) //从前往后遍历比较
if(bts[i]>bts[i+1]){
t=bts[i];
bts[i]=bts[i+1];
bts[i+1]=t;
}
printf("该10个地区面积由小到大排序:\n");
for(i=0;i<10;i++)
printf("%d ",bts[i]);
return 0;
}