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