簡體   English   中英

冒泡排序C程序中可能的錯誤

[英]Possible mistake in bubble sort c program

我正在閱讀Patterson和Hennesy(第5版)的書“計算機組織和設計”,發現此冒泡排序代碼:

void sort (int v[], int n)
{
    int i,j;
    for (i=0; i<n; i+=1) {
        for (j = i-1; j>=0 && v[j] > v[j+1]; j+=1) {
            swap(v,j);
        }
    }
}

void swap (int v[], int k) {
    int temp;
    temp = v[k];
    v[k] = v[k+1];
    v[k+1] = temp;
}

我不明白該函數將如何對數組進行排序。 特別是如果數組的第一個元素也是最大的,在我看來,索引j會超出范圍。 運行代碼並打印索引確認了這一點。

這是我使用的代碼:

#include <stdio.h>

void swap (int v[], int k) {
    int temp;
    temp = v[k];
    v[k] = v[k+1];
    v[k+1] = temp;
}

void sort (int v[], int n)
{
    int i,j;
    for (i=0; i<n; i+=1) {
        printf("%d \n", i);
        for (j = i-1; j>=0 && v[j] > v[j+1]; j+=1) {
            printf("%d, %d \n", i, j);
            swap(v,j);
        }
    }
}

int main() {
    int x[3] = {5,1,2};
    int N = 3;

    sort(x, N);
    for(int i = 0; i < 3; i++) {
        printf("%d ", x[i]);
    }
    return 0;
}

結果是:

/Users/mauritsdescamps/Desktop/test/cmake-build-debug/test
0 
1 
1, 0 
1, 1 
1, 2 
1, 3 
1, 4 
2 
2, 1 
2, 2 
2, 3 

Process finished with exit code 6

有什么我忘記的事情嗎? 如果沒有,我認為第二個循環條件一定有一個錯誤。 我已經看到了該算法的其他實現,但是我想知道如何使這種方法起作用。

我也嘗試過此代碼。 我已經用GCC對其進行了編譯,並且以某種方式對我有用(程序的退出狀態為0,數組已正確排序)。 但是我也認為第二循環是一個問題。 我會將j + = 1指令更改為j- = 1。 否則,第二個循環可能以無限循環結束。 另外,我會將第一個循環中的i = 0指令更改為ai = 1指令,因為它將以不必要的迭代結束。

暫無
暫無

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

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