双向冒泡排序 含注解 含过程

/*
双向冒泡排序是在冒泡排序的基础上改进而来的,其基本思想跟最原始的冒泡排
序是一样的,只不过排序过程稍微优化了一点。 我们还是以整数升序排序为例来简单说说这种排序的过程:
首先从前往后把最大 数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程 就是第一轮,然后重复这一过程,
最终就会把整个数组从小到大排列好。双向冒 泡排序要稍微优于传统的冒泡排序,因为双向排序时数组的两头都排序好了,
我们只需要处理数组的中间部分即可,而单向即传统的冒泡排序只有尾部的元素是 排好序的,这时每轮处理都需要从头一直处理到
已经排好序元素的前面一个元 素。虽然它在效率上有了点改进,但它也不能大幅度提高其排序的效率,这是由 冒泡排序的基本过程所决定了的。

双向冒泡前数组 8   4   2   3   5   1   6   9   0   7

第 1 次排序-->4   2   3   5   1   6   8   0   7 9
//第一次正向排序,得到未排序数组中最大的数   9

第 1 次排序<--0   4   2   3   5   1   6   8   7 9
//第一次反向排序,得到未排序数组中最小的数   0

第 2 次排序-->0   2   3   4   1   5   6   7   8 9
//第二次正向排序,得到未排序数组中最大的数   8

第 2 次排序<--0   1   2   3   4   5   6   7   8 9
//第一次反向排序,得到未排序数组中最大的数   1

第 3 次排序-->0   1   2   3   4   5   6   7   8 9
//运气比较好,前两次已经排好序了,flag = 0,不进行第三次排序 双向冒泡后数组  0   1   2   3   4   5   6   7   8   9
*/
#include<stdio.h>
#include<stdlib.h>
#define max 10 

//打印结果
void Show(int arr[],int n)
{
	int i;
	for(i = 0;i < n;i ++)
		printf("%d ",arr[i]); 
	printf("\n");		
} 

// 交换数组元素位置
void Swap( int *num_a, int *num_b ) //传入数组地址 
{
	int temp = *num_b;  //指针取值交换 
	*num_b = *num_a;
	*num_a = temp;
}

//改进版的冒泡排序(双向冒泡)
void BidBubbleSort(int array[], int n)
{
	int low, high, flag, i; low = 0;
	high = n - 1; 
	while(low < high)
	{
		flag=0;
		for(i=low; i<high; i++)  //正向冒泡
		{
			if(array[i] > array[i+1]) //找到剩下中最大的
			{
			Swap(&array[i], &array[i+1]); 
			flag = 1;    //标志, 有数据交换				
			}	
		}
		if( !flag )
			break; 
		high--;
		for( i=high; i>low; i-- ) //反向冒泡
		{
			if(array[i] < array[i-1]) //找到剩下中最小的 
				Swap(&array[i], &array[i-1]);
		}
		low++;
	}
}

int main()
{ //测试数据
	int arr_test[max]={8,4,2,3,5,1,6,9,0,7};
	printf("排序前数组: "); 
	Show(arr_test,max);
	BidBubbleSort(arr_test,max);
	printf("排序后数组: ");
	Show(arr_test,max);
	return 0; 
}
 
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值