考研数据结构与算法之排序专题二 冒泡排序及优化

冒泡排序顾名思义就是由于在排序过程中总是小数往前放,大数往后放,相当于气泡上升。
基本思想:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。然后从头开始比较,比较n-2次,第二次结束,重复以上操作
至排序结束。
测试谭浩强版冒泡排序(B_S_Tan)对随机生成的10000个数的数组进行排序所用时间为0.974s(每次运行所需时间不同)

优化后的冒泡排序(B_S_Op)随机生成100 000个数的数组进行排序所用时间仅为 0.004s(每次运行所需时间较大不同)

设置一个flag个标志,如果这一趟排序发生了交换,则将flag置为true,否则为flase,显然如果一趟排序没有发生交换则说明数组已排好序。
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define bool int
#define true 1
#define false 0
#define SIZE 100000


void B_S(int s[], int n){
	int i,pos,j,temp;
	for ( i = 0; i < n; i++){
		pos = 1;
		for (j = 0; j < n-i-1; j++){
			if (s[j] > s[j + 1]){
				temp = s[j];
				s[j] = s[j + 1];
				s[j + 1] = temp;
				pos = 0;
			}
		}
		if (pos)
			return;
	}
}
void B_S_Tan(int s[],int n)
{
	int i,j,temp;
	for(j=0;j<n-1;j++)
	{
		for(i=0;i<n-1-j;i++)
		{
			if(s[i]>s[i+1])
			{
				temp=s[i];
				s[i]=s[i+1];
				s[i+1]=temp;
			}
		}
	}
	printf("the sorted numbers:\n");
}
void B_S_Op(int s[], int n)  
{  
       int j, k,temp;  
       bool flag;  
  
       k = n;  
       flag = true;  
       while (flag)  
       {  
              flag = false;  
              for (j = 1; j < k; j++)  
                     if (s[j - 1] > s[j])  
                     {  
                            temp=s[j];
							s[j]=s[j-1];
							s[j-1]=s[j];
                            flag = true;  
                     }  
              k--;  
       }  
}  

int main(int argc, char *argv[]){
	int s[SIZE];
	int i;
	clock_t start, finish;
	double Total_time;
	for (i = 0; i < SIZE; i++){
		s[i] = rand() % 100;
	}
	start = clock();
	B_S_Op(s,SIZE);
	//B_S_Tan(s, SIZE);
	//B_S(s,SIZE);
	finish = clock();
	Total_time = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("%d个数的运行时间为%.3f\n", SIZE, Total_time);
	/*for (i = 0; i < SIZE; i++)
		printf("%d ", s[i]);*/
	printf("\n");
	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

For_dongyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值