改进版的冒泡排序(双向冒泡算法)

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
 
//一般的冒泡排序
void  bubbleSort( int  a[], int  n)
{
     int  i, j, k;
     int  temp;
 
     for  (i = 0; i < n; i++){    //最多做n-1趟排序
         for (j = 0 ;j < n - i - 1; j++){  
             if (a[j] > a[j + 1]){    //把大的值交换到后面
                 temp = a[j];
                 a[j] = a[j + 1];
                 a[j + 1] = temp;
             }
         }           
         printf( "第%d次排序结果:" , i + 1);
         for (k = 0; k < n; k++){
             printf( "%d\t" , a[k]);
         }
         //printf("\n");
     }
     printf( "最终排序结果: " );
     for (k = 0; k < n; k++){
         printf( "%d\t" , a[k]);
     }
}
 
//改进版的冒泡排序(双向冒泡)
void  bidBubbleSort( int  a[], int  n)
{
     int  left, right, t, l, r, j, i = 0;
 
     left =0;
     right = n -1;
 
     //双向冒泡算法,极大的减少了循环排序的次数
     while (left < right)
     {
         //必须要给l和r赋值,否则若数组一开始就有序,则right=r中的r未赋值,即报错
         l = left + 1;
         r = right -1;
 
         //第一次循环将最大的值放到末尾
         for (j = left; j < right; j++)
         {
             if (a[j] > a[j + 1])
             {
                 t = a[j];
                 a[j] = a[j + 1];
                 a[j + 1] = t;
                 r = j;
             }
         }
         right = r;
 
         //第二次循环将最小的值放到了开头
         for (j = right; j > left; j--)
         {
             if (a[j] < a[j - 1])
             {
                 t = a[j];
                 a[j] = a[j - 1];
                 a[j - 1] = t;
                 l = j;
             }
         }
         left = l;
 
         printf( "第%d次排序结果:" , i + 1);
         i++;
         for (j = 0; j < n; j++){
             printf( "%d\t" , a[j]);
         }
     }
      printf( "最终排序结果: " );
     for (j = 0; j < n; j++){
         printf( "%d\t" , a[j]);
     }
}
 
int  _tmain( int  argc, _TCHAR* argv[])
{
     int  score1[] = {98, 69, 75, 47, 89, 90, 100, 70};
     bubbleSort(score1, 8);
     printf( "\n" );
     int  score2[] = {98, 69, 75, 47, 89, 90, 100, 70};
     bidBubbleSort(score2, 8);
 
     system( "pause" );
     return  0;
}

 下面是运行效果:

可见,双向冒泡排序能大大减少排序的次数,值得借鉴!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值