C語言學習Day21

今天主要學習了數組的算法:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//求斐波拉茲數列
void Fibonacci()
{
    int arr[20] = { 1, 1 };

    for (int i = 2; i < 20; i++)
    {
        arr[i] = arr[i - 1] + arr[i - 2];
    }
    for (int i = 0; i < 20; i++)
    {
        if (0 == i % 5)
        {
            printf("\n");
        }
        printf("%d\t", arr[i]);

    }
    printf("\n");
}

//冒泡排序
void MaoPao()
{
    int arr[10];
    //隨機數種子
    srand((unsigned)time(NULL));

    //隨機輸入
    for (int i = 0; i < 10; i++)
    {
        //隨機分配10個數到數組中
        arr[i] = rand() % 100;
    }

    //排序
    int mark = 10, flag = 0;    
    for (int i = 0; i < --mark;)
    {
        int x = 0;
        for (int j = 0; j < mark; j++)
        {
            if (arr[j] > arr[j+1])
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
            x++;

        }
        printf("%d\t", x);
        flag++;
    }

    printf("%d\n", flag);
    //輸出
    for (int i = 0; i < 10; i++)
    {
        if (0 == i % 5)
        {
            printf("\n");
        }
        printf("%d\t", arr[i]);
    }
    printf("\n");
}

//二維數組行列互換函數
void TwoArray1()
{
    int arr1[2][3] = { {1,2,3},{4,5,6} };
    int arr2[3][2] = { 0 };

    //二維數組行
    for (int i = 0; i < 2; i++) {
        //二位數組列
        for (int j = 0; j < 3; j++) {
            arr2[j][i] = arr1[i][j];
        }
    }

    //輸出二維數組
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%d\t", arr2[i][j]);
        }
        printf("\n");
    }

}

//找出二維數組中最大的那個數和他的行列
void TwoArray2()
{
    int arr[3][4] = {0};

    //隨機賦值
    srand((unsigned)time(NULL));
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            arr[i][j] = rand() % 100;
        }
    }

    //求最大值
    int max = arr[0][0],row,col;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 4; j++) {
            if (arr[i][j] > max) {
                max = arr[i][j];
                row = i + 1;//用於保存最大值行
                col = j + 1;//用於保存最大值列
            }
        }
    }

    //輸出二維數組
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }
    printf("最大值爲:>%d\n其座標爲:>(%d,%d)", max, row, col);

}

//輸出某一行和某一列,其餘位置空白
void TwoArray3()
{
    int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (i == 1 || j == 1) {
                printf("%-5d", arr[i][j]);
            }
            else {
                printf("%-5c",' ');
            }
        }
        printf("\n");
    }
}

//二分法查找
void Half()
{
    int arr[10] = { 1,2,3,76,345,887,34,67 };
    int left = 0, right = 9, mid;
    ////隨機賦值
    //srand((unsigned)time(NULL));
    //for (int i = 0; i < 10; i++) 
    //{
    //  arr[i] = rand() % 100;
    //}

    //用插入排序
    for (int i = 1; i < 10; i++)
    {
        int key = arr[i];
        int j = i - 1;
        while ((j >= 0) && (arr[j] > key))
        {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }

    for (int i = 0; i < 10; i++)
    {
        printf("%d\t", arr[i]);
    }
    printf("\n");

    //折半查找

    while (left < right)
    {
        mid = (left + right) / 2;
        if (3 == arr[mid])
        {
            printf("3的位置爲:>%d\n", mid);
            break;
        }
        else if (3 > arr[mid])
        {
            right = mid;
        }
        else
        {
            left = mid;
        }
    }
}

int main()
{
#if(0)
    Fibonacci();//調用斐波拉茲函數
    MaoPao();//調用冒泡排序
    TwoArray1();//調用二維數組行列互換函數
    TwoArray2();//找出二維數組中最大的那個數和他的行列
    TwoArray3();//輸出某一行和某一列,其餘位置空白
#endif
    Half();//二分法查找

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章