簡體   English   中英

使用遞歸對數組進行排序

[英]Sort array using recursion

我一直在嘗試使用遞歸對數組進行排序,但我沒有得到 output,有人可以幫我解決這個問題,比如為什么沒有 output?

void sortarray(int arr[], int index, int key, int len){

    if (index == len-2){
    }
    else{
        if (key==len-1){
            key=0;
            sortarray(arr, index++, key, len );
        }
        else {
            if (arr[key] > arr[key+1]){
                swap(arr[key], arr[key+1]);
            }
         
            sortarray(arr, index, key++, len );


        }
    }
}

int main(){
    int arr[5] = {5,6,4,3,2};
    sortarray(arr, 0,0,5);
    for(int i=0; i<5; i++){
        cout << arr[i] << "  ";
    }
}

我修復了段錯誤並簡化了代碼以使其更清楚地說明它的作用。 即,遍歷數組一次,如果下一個更大,則將鍵與下一個交換。 這不是有效的排序算法:

#include <iostream>
using namespace std;

void sortarray(int arr[], int key, int len) {
    // base case
    if (key + 1 == len) return;

    // recursive case
    if (arr[key] > arr[key + 1]){
        swap(arr[key], arr[key + 1]);
    }
    sortarray(arr, key + 1, len );
}

int main() {
    int arr[] = {5,6,4,3,2};
    int len = sizeof(arr) / sizeof(*arr);
    sortarray(arr, 0, len);
    for(int i = 0; i < len; i++) {
        cout << arr[i] << "  ";
    }
    return 0;
}

結果是:

5  4  3  2  6

我對你的代碼進行了一些編輯,它現在可以工作了(不要介意 printArr function,它存在只是因為 main 中的循環很難看):

#include <iostream>
using namespace std;

void printArr(int arr[], int size)
{
    for (int i = 0; i < size; i++) {
        cout << arr[i] << "  ";
    }
    cout << endl;
}

void sortarray(int arr[], int index, int key, int len)
{
    if (index < len)
    {
        if (key == len - 1) {
            key = 0;
            sortarray(arr, ++index, key, len);
        }
        else {
            if (arr[key] > arr[key + 1]) {
                swap(arr[key], arr[key + 1]);
            }
            sortarray(arr, index, ++key, len);


        }
    }
}


int main()
{
    int arr[5] = { 5,6,4,3,2 };
    cout << "Before sort:" << endl;
    printArr(arr, sizeof(arr)/sizeof(*arr));
    sortarray(arr, 0, 0, 5);
    cout << "After sort:" << endl;
    printArr(arr, sizeof(arr) / sizeof(*arr));
    return 0;
}

所以第一個問題是缺少 iostream 和 std 命名空間。 算法本身的主要變化是:

  • 將 argument++ 更改為 ++argument
  • 將第一個條件更改為 (index < len)

至於為什么你的代碼不能正常工作:索引錯過了停止條件並超過了 len 的值(因此屏幕 o' fives)。

所以這回答了你的問題,但是一旦有兩個相同的值彼此相鄰,你編寫的這個算法就會中斷。 我們使用循環進行排序是有充分理由的,除非遞歸是重點,否則我建議放棄它來完成這項任務。

我一直在嘗試使用遞歸對數組進行排序,但我沒有得到 output,有人可以幫我解決這個問題,比如為什么沒有 output?

void sortarray(int arr[], int index, int key, int len){

    if (index == len-2){
    }
    else{
        if (key==len-1){
            key=0;
            sortarray(arr, index++, key, len );
        }
        else {
            if (arr[key] > arr[key+1]){
                swap(arr[key], arr[key+1]);
            }
         
            sortarray(arr, index, key++, len );


        }
    }
}

int main(){
    int arr[5] = {5,6,4,3,2};
    sortarray(arr, 0,0,5);
    for(int i=0; i<5; i++){
        cout << arr[i] << "  ";
    }
}

此代碼完美運行-:

   void sortArr(int arr[],int index, int key, int len){
        // static int index = 0;
        // static int key = 0;
        if (index == len-1){
        }
        else{
            if (key==len-1){
                key=0;
                sortArr(arr,index+1,key,len );
            }
            else {
                if (arr[key] > arr[key+1]){
                    swap(arr[key], arr[key+1]);
                }
                sortArr(arr, index, key+1 ,len );
            }
        }
    }
int main(){
    int arr[5] = {5,6,4,3,2};
    sortarray(arr, 0, 5);
    for(int i=0; i<5; i++) {
        cout << arr[i] << "  ";
    }
    return 0;
}

代碼的output為:

2 3 4 5 6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM