【基礎算法】冒泡排序+二分查找法

 

  一、思考題算法

  (1)有12顆球,1顆是9克,其他的都是10克,怎樣在天平上稱三次找出9克的那顆質量小的球?數組

  答:第一次:把12顆球分紅兩半,一半6顆,在天平上稱,取質量小的一邊;spa

    第二次:把6顆球分紅兩半,一半三顆,也取質量小的一邊;code

    第三次:取三顆球中任一兩顆去稱,若是質量相等,那麼沒有稱的那一顆就是質量最小的一顆(9克),若是兩顆質量不想等,取質量小的一顆也能夠取到。blog

  (2)有1024我的,有一我的血液有病毒,而999我的沒有病毒,化驗一我的的血液須要10分鐘,怎麼用最短的時間找出有血液病毒的那我的?排序

  答:普通的方法,若是每一個人都檢查的話,須要話的時間最多須要10000分鐘,是須要幾天。io

           咱們這樣,1024我的分爲兩組,每人抽一次血混合,查看有病毒的一組再分紅兩半測,直到測出爲止,這種方法只須要 2x=1024,x=10 ,就只須要10次,100分鐘便可for循環

  (3)有1到100的數,隨機尋找1到100的數,怎麼在最短的時間找到?class

  答:把1到一百分紅兩半,把中間的數和隨機數比較,若是隨機數大於中間數,選擇大於的一半數再分紅兩半查找,再和隨機數比較,不停的分紅兩半取中間比較值,直到找到爲止;若是小於,反之;原理

  二、二分法查找

  上面的思考題就是運用了二分法查找的原理。

  二分法僞代碼: 

             輸入 f(x) 的定義
             輸入 a 和 b 爲初始區間

             重複以下:
             m := (a + b) / 2
             若是 f(m) * f(a) < 0 則
             b := m
             不然
             a := m
            直至滿意爲止

  

  三、冒泡排序

  選擇排序法

    int a[10] = { 23, 3, 234, 2, 56, 34, 34, 54, 24, 67 };
    //選擇排序法
    for (int i = 0; i < 10; i++)
    {
        for (int j = i + 1; j < 10; j++)
        {
            if (a[i] < a[j])
            {
                int tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
        }
    }

 

  二分法查找必須針對有序數組,若是不是有序的,咱們就要對數組進行排序。冒泡排序算法:

void  bubble_sort(int arr[], int length)
{
    for (int i = 0; i < length - 1; i++)
    {
        for (int j = 0; j < length - 1 - i; j++)
        {
            if (arr[j]>arr[j + 1])
            {
                //交換兩個數
                arr[j] = arr[j] + arr[j + 1];
                arr[j + 1] = arr[j] - arr[j + 1];
                arr[j] = arr[j] - arr[j + 1];
            }
        }
    }
}

  四、二分法查找

//二分法排序 while循環實現
int dichotomy1(int arr[], int length, int num)
{
    int head = 0;
    int foot = length - 1;
    int middle = (head + foot) / 2;
    while (head <= foot)
    {
        if (arr[middle] = num)
        {
            return middle;
           
        }
        else if (arr[middle] < num)
        {
            head = middle-1;
            middle = (head + foot) / 2;
        }
        else if (arr[middle] > num)
        {
            foot = middle+1;
            middle = (head + foot) / 2;
        }
    }
    return -1;
}
//二分查找 for循環實現
int dichotomy2(int arr[], int length, int num)
{
    for (int head = 0, foot = length - 1, middle = (length-1)/2; head <= foot;middle=(head+foot)/2)
    {
        if (arr[middle] == num)
        {
            return middle;
        }
        else if (arr[middle]>num )
        {
            foot = middle - 1;
        }
        else if (arr[middle]<num)
        {
            head = middle + 1;
            
        }
    }
    return -1;
}

  五、完整實例

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 100
//二分法排序 while循環實現
int dichotomy1(int arr[], int length, int num)
{
    int head = 0;
    int foot = length - 1;
    int middle = (head + foot) / 2;
    while (head <= foot)
    {
        if (arr[middle] = num)
        {
            return middle;
            
        }
        else if (arr[middle] < num)
        {
            head = middle-1;
            middle = (head + foot) / 2;
        }
        else if (arr[middle] > num)
        {
            foot = middle+1;
            middle = (head + foot) / 2;
        }
    }
    return -1;
}
//二分查找 for循環實現
int dichotomy2(int arr[], int length, int num)
{
    for (int head = 0, foot = length - 1, middle = (length-1)/2; head <= foot;middle=(head+foot)/2)
    {
        if (arr[middle] == num)
        {
            return middle;
        }
        else if (arr[middle]>num )
        {
            foot = middle - 1;
        }
        else if (arr[middle]<num)
        {
            head = middle + 1;
            
        }
    }
    return -1;
}
void  bubble_sort(int arr[], int length)
{
    for (int i = 0; i < length - 1; i++)
    {
        for (int j = 0; j < length - 1 - i; j++)
        {
            if (arr[j]>arr[j + 1])
            {
                //交換兩個數
                arr[j] = arr[j] + arr[j + 1];
                arr[j + 1] = arr[j] - arr[j + 1];
                arr[j] = arr[j] - arr[j + 1];
            }
        }
    }
}
void main()
{
    time_t t;
    srand((unsigned int)time(&t));
    int a[N];
    for (int i = 0; i < N; i++)
    {
        a[i] = rand() % 100;//生成100之內的隨機數
        printf("%-2d\t", a[i]);
    }
    bubble_sort(a,N);    
    printf("排序後\n");
    for (int i = 0; i < N; i++)
    {
        printf("%-2d\t", a[i]);
    }
    printf("請輸入要查找的數\n");
    int num;
    scanf_s("%d", &num);
    int found = dichotomy2(a,N,num);
    if (found != -1)
    {
        printf("found!a[%d]=%d",found,num);
    }
    else
    {
        printf("not found!");
    }
    system("pause");

}
相關文章
相關標籤/搜索