利用二分法排序


#include <stdio.h>

int main()
{
        int array[10] , new[10];

        int i , j , m ,k , low , up , mid ;   // low、up是每次二分法查找的头位置和尾位置,mid是中间的位置

        printf("Please input 10 numbers for array:\n");

        for( i = 0 ; i < 10 ; i++ )
        {
                scanf("%d",&array[i]);
        }
   /*将array数组的前两个数按大小赋给new数组的前两个元素*/
        new[0] = (array[0] < array[1]) ? array[0] : array[1];
        new[1] = (array[0] > array[1]) ? array[0] : array[1];

        m = 2;         //新数组new的有效个数

        for( i = 2 ; i < 10 ; i++ )
        {
                low = 0;                      // 每一个数插入式low、up都要指向new的第一个和最后一个元素
                up = m - 1;

                while( (up - low) > 1)          //利用二分法查找插入的数要放的可能的位置
                {
                        mid = (up + low)/ 2;

                        if( array[i] > new[mid] )
                        {
                                low = mid;
                        }
                        else
                        {
                                up = mid;
                        }
                }
/*比较插入的数与low和up位置的大小,准确定位要插入的位置   */
                if( (up - low) == 1)
                {
                        /* 要插入两者之间up及后面的数逐个后移*/
                        if( array[i] >= new[low] && array[i] <= new[up])
                        {
                                for( k = m ; k > low ; k-- )
                                {
                                        new[k] = new[k - 1];
                                }

                                new[low + 1] = array[i];
                        }
/*要插入up后面时,一定是要排在所有元素的后面,所有直接加在后面即可*/
                        else if(array[i] > new[up])
                        {
                                new[m] = array[i];
                        }
/*要插入low前面时,一定是第一个元素,所以所有的元素都要后移一个*/
                        else
                        {
                                for(k = m ; k > low ; k-- )
                                {
                                        new[k] = new[k - 1];
                                }
                                new[low] = array[i];
                        }
                }
                m++;     //每插入一个数,new数组的有效个数加1
        }


        printf("The new  10 numbers is :\n");

        for( i = 0 ; i < 10 ; i++ )
        {
                printf("%d  ",new[i]);
        }

        putchar('\n');

        return 0;

}

程序运行示例:

Please input 10 numbers for array:

12 45 78 65 24  23 01 10 12 15
The new  10 numbers is :
1  10  12  12  15  23  24  45  65  78 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值