二分法查找和排序 示例:數組
#include <stdio.h>
/*
二分法查找和排序示例
20190626
*/
int main()
{
int data[10] = {7,1,11,67,5,3,89,4,5,33};
for(int i=1;i<10;i++) //大循環 從數組第2個元素開始,前面的第一個元素構成一個有序數組(此時數組裏只有一個元素,固然是"有序"的了) , 在大循環的第一次循環中,把第2個元素經過二分查找方法,插入前面的有序數組(只有一個元素)中, 這樣頭兩個元素就構成一個新的有序數組. 依次類推, 下次循環把第三個元素插入前面的有序數組中... 不斷循環下去, 整個數組就排序了.
{
int mid=0; //二分位置
int left=0; //左邊界位置
int right=i-1; // 右邊界位置
int tmp=data[i];
while(left<=right) //若是左右邊界重合了, 即left==right了, 但此時插入元素可能比重合處的元素小,也可能比重合處的元素大,所以,還要循環一次,進一步與重合處位置處的元素比較 ,因此這裏的循環條件必須是 (left<=right)
{
mid=(left+right)/2; //求中間元素數組座標 (~~當左右邊界重合時, 中間元素就是自身)
if(tmp<data[mid]){ //把待插入數與二分位置處元素比較, 若是比二分元素小,則右邊界right移到二分元素以前的位置
right=mid-1;
}else{ //若是大於等於二分元素,則左邊界left移動到二分元素以後的位置
left=mid+1;
}
printf("mid=%d,left=%d,right=%d\n",mid,left,right);
}
//循環結束時, 插入位置就是left所指向的位置.
for(int j=i-1;j>=left;j--) //循環的做用是把有序數組中元素從left位置向後平移一次,把left位置騰出來
{
data[j+1]=data[j];
}
data[left]=tmp; //騰出的left位置放入要插入元素
}
for (int i = 0; i <10 ; i++)
{
printf("%d ",data[i]);
}
return 0;
}排序
輸出結果: mid=0,left=0,right=-1
mid=0,left=1,right=1
mid=1,left=2,right=1
mid=1,left=2,right=2
mid=2,left=3,right=2
mid=1,left=0,right=0
mid=0,left=1,right=0
mid=2,left=0,right=1
mid=0,left=1,right=1
mid=1,left=1,right=0
mid=2,left=3,right=5
mid=4,left=5,right=5
mid=5,left=6,right=5
mid=3,left=0,right=2
mid=1,left=2,right=2
mid=2,left=2,right=1
mid=3,left=4,right=7
mid=5,left=4,right=4
mid=4,left=4,right=3
mid=4,left=5,right=8
mid=6,left=7,right=8
mid=7,left=7,right=6
1 3 4 5 5 7 11 33 67 89 io