簡體   English   中英

C 中的高效冒泡排序?

[英]Efficient Bubble Sort in C?

我目前正在做一個大學項目來練習指針和數組修改。 要獲得項目的完整 4.0,我需要調整我的冒泡排序代碼以提高效率。 換句話說,我需要 function 在數組成功排序后停止運行排序迭代。 老實說,我被打敗了。 我需要關於如何實現這一目標的所有建議。

我的代碼如下:

int bubbleSortAscend(int *ary, int i, int l) {
    for (i = 0; i < l; i++) {
        if (*(ary + i) > *(ary + (i + 1))) {
            int temp = *(ary + (i + 1));
            *(ary + (i + 1)) = *(ary + i);
            *(ary + i) = temp;
        }
    }
}

先感謝您!

知道了。 感謝 ShadowRanger 的建議。 我采納了他的想法並加以考慮。 下面的代碼,以 Boolean 設置為 false 開始,如果無法進行更多排序。 循環將中斷然后打印。 我確信有比我做的更緊湊的方法(我是 C noob :) 但這是它背后的想法:P

編輯:這以前是不正確的。 新代碼:

int bubbleSortAscend(int *ary, int i, int l){
    char sorted = false;

    l -= 1;
    while(sorted == false) {
      sorted = true;
      for (i = 0; i < l; i++) {
        if(*(ary+i) > *(ary+(i+1))) {
          int temp = *(ary+(i+1));
          *(ary+(i+1)) = *(ary+i);
          *(ary+i) = temp;
          sorted = false;
          }
        }
      }
    printf("Your sorted array is: ");
    for(i = 0; i < (l + 1); i++)
      printf("%d ", *(ary+i));
    printf("\n");

將 sorted 的值更改為 true 現在發生在 for 循環之外,而不是在 else 語句中。 再次感謝大家的幫助。

您的代碼沒有實現冒泡排序,因為您只對數組執行一次傳遞。 此外,您訪問數組末尾以外的元素,不需要第二個參數。

這是一個高效(*)的修改版本,因為它會在數組排序后立即停止:

int bubbleSortAscend(int *ary, int n) {
    for (;;) {
        int sorted = 1;
        for (int i = 0; i < n - 1; i++) {
            if (*(ary + i) > *(ary + (i + 1))) {
                int temp = *(ary + (i + 1));
                *(ary + (i + 1)) = *(ary + i);
                *(ary + i) = temp;
                sorted = 0;
            }
        }
        if (sorted)
            return;
    }
}

除非您被要求使用指針語法,否則代碼將以這種方式更具可讀性:

int bubbleSortAscend(int *ary, int n) {
    for (;;) {
        int sorted = 1;
        for (int i = 0; i < n - 1; i++) {
            if (ary[i] > ary[i + 1]) {
                int temp = ary[i];
                ary[i] = ary[i + 1];
                ary[i + 1] = temp;
                sorted = 0;
            }
        }
        if (sorted)
            return;
    }
}

(*)高效的冒泡排序是一個非常好的 CS 矛盾修辭法。 冒泡排序的平均時間復雜度為O(n 2 ) ,因此效率不高,但良好的實現在排序列表上具有線性復雜度:比標准歸並排序和快速排序好得多。 事實上,快速排序的簡單實現對於排序列表具有二次復雜性

暫無
暫無

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

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