二分法查找和排序c語言示例

二分法查找和排序  示例:數組

#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

相關文章
相關標籤/搜索