往有序數組中插入數

/*已知數組a中的元素已按由小到大順序排列,如下程序的功能是將輸入的一個數插入數組a中,插入後,數組a中的元素仍然由小到大順序排列*/數組

#include <stdio.h>
/**
 *  折半查找法找到須要插入的位置(下標)
 *
 *  @param p      數組
 *  @param num    須要插入的數
 *  @param length 數組元素的個數
 *
 *  @return 須要插入數組對應的下標
 */
int arrayInsertNumber(int *p, int num,int length)
{
    int max = length - 1;
    int min = 0;
    int mid = (max + min)/2;
    
    while (max >= min) {
        mid = (max + min)/2;
        if (num > p[mid]) {
            min = mid + 1;
        }else if (num < p[mid]) {
            max = mid - 1;
        }else {
            return mid;
        }
    }
    return mid - 1;
}

int main(int argc, const char * argv[]) {
    
    int  a[] = {1,3,5,5,7,9,10,19,20,30};
    int length = sizeof(a)/sizeof(a[0]);
    //定義數組b[]保存插入後的數據
    int b[length + 1];
    
    int num;
    printf("請輸入須要插入數組中的數字\n");
    scanf("%i",&num);
    //調用函數獲取下標
    int index = arrayInsertNumber(a, num, length);
    printf("須要插入數組a[]下標爲 %i 的位置\n",index);
    
    int j = 0;
    //遍歷數組a[]
    for (int i = 0; i < length ; i++) {
        //index前的數分別對應賦值給b[]
        if (i < index) {
            b[j++] = a[i];
        }
        //index對應的a[i]仍然對應賦值,把num插入到index+1的位置
        else if (i == index) {
            b[j] = a[i];
            b[++j] = num;
        }
        //原a數組index以後的數據依次後移一位
        else {
            b[++j] = a[i];
        }
    }
    printf("插入後的數組爲:\n");
    //遍歷輸出b[]
    for (int i = 0; i < length + 1; i++) {
        printf("%i ",b[i]);
    }
    printf("\n");
    return 0;
}
相關文章
相關標籤/搜索