Who 發問時間: 電腦與網際網路程式設計 · 8 年前

(c語言)用遞迴找陣列中最小值的索引

這個作業是要遞迴寫slection sort

他規定要先寫一個函數找出the index of the min

也要用遞迴(不能用迴圈)

這兩個函數的宣告:

void ssort(int n);

int findmin(int n);

我主要是要findmin這個函數

不過兩個都寫出來了更好

記得用"C"寫!!

2 個解答

評分
  • 8 年前
    最佳解答

    #include <stdlib.h>

    #include <stdio.h>

    #include <time.h>

    #define NUM 30

    int *a;

    void ssort(int);

    void ssort1(int);

    int findmin(int);

    int main(int argc, char** argv)

    {

    int i, min;

    srand(time(NULL));

    a = malloc(sizeof(*a) * NUM);

    for (i = 0; i < NUM; ++i) a[i] = rand()%100 + 1;

    for (i = 0; i < NUM; ++i) printf("%d\t", a[i]);

    printf("\n");

    ssort(NUM); //ascending

    for (i = 0; i < NUM; ++i) printf("%d\t", a[i]);

    printf("\n");

    ssort1(NUM); //descending

    for (i = 0; i < NUM; ++i) printf("%d\t", a[i]);

    printf("\n");

    system("pause");

    return 0;

    }

    //ascending

    void ssort(int n)

    {

    int min, temp, *p = a;

    while (n > 1) {

    min = findmin(n);

    temp = *a; *a = a[min]; a[min] = temp;

    -- n; ++a;

    }

    a = p ;

    }

    //descending

    void ssort1(int n)

    {

    int min, temp;

    while (n > 1) {

    min = findmin(n);

    --n;

    temp = a[n]; a[n] = a[min]; a[min] = temp;

    }

    }

    int findmin(int n)

    {

    if (--n == 0) return 0;

    int k = findmin(n);

    return a[n] > a[k] ? k : n;

    }

    2012-08-13 02:40:44 補充:

    沒注意到ssort 也要用遞迴。

    改用遞迴的寫法如下:

    //ascending

    void ssort(int n)

    {

    int min, temp;

    if (n > 1) ssort(n-1);

    min = findmin(NUM-n+1);

    temp = *a; *a = a[min]; a[min] = temp;

    ++a;

    if (n == NUM) a = a - NUM ;

    }

    2012-08-13 02:47:04 補充:

    餘參意見。

    2012-08-13 02:48:32 補充:

    已逾限制字數,ssort1的遞迴寫法補充在此。

    //descending

    void ssort1(int n)

    {

    int min, temp;

    min = findmin(n);

    --n;

    temp = a[n]; a[n] = a[min]; a[min] = temp;

    if (n > 0)ssort1(n);

    }

  • 8 年前

    用遞迴的關念把"在一個陣列之中找最小"先定意出來後就很簡單了啦!

    1.結束:

    switch(sizeof(array)) {

    case 0: return -1;

    case 1: return 0;

    default: break;

    }

    2012-08-12 23:08:31 補充:

    2.遞回:

    mid = sizeof(array)/2;

    min0 = call_recursively(array[0..mid-1]);

    min1 = call_recursively(array[mid..end]);

    if ( 0 > min0) return min1+mid;

    if ( 0 > min1) return min0;

    return (array[min0] > array[min1+mid]) ? (min1+mid) : min0;

    1

    2012-08-12 23:18:50 補充:

    // also - this definition is problematic:

    // typical recursive routines should have the target data on the argv

    //

    int findmin(int n);

還有問題?馬上發問,尋求解答。