交换排序—冒泡排序

目录

1. 什么是交换排序

2. 什么是冒泡排序

3. 冒泡排序算法的代码

4. 有关排序的简单例题


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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值