#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 15The new 10 numbers is :
1 10 12 12 15 23 24 45 65 78