簡體   English   中英

為什么我的替代排序算法不起作用?

[英]Why didn't my alternative sorting algorithm work?

我試圖實現一個排序代碼,所以我完全嘗試了一些事情,而沒有查看任何其他參考代碼或任何東西。 請告訴我為什么我的代碼不顯示任何輸出? 它只運行了一段時間,然后突然停止。

我想知道我要去哪里錯了。 我想將任何數組作為輸入並按升序對數字進行排序。 所以我只是迭代數組的吞吐量,比較相鄰的元素並交換它們。 然后,我嘗試使用其索引打印數字,但屏幕上未打印任何內容。

#include <iostream>
using namespace std;
int main() {
  int arr[6]={1,23,2,32,4,12};
  int i=0;
  while(i<6)
  {
    if(arr[i]>arr[i+1])
    {
      int x = arr[i];
      arr[i]=arr[i+1];
      arr[i+1]=x;
    }
    else
      continue;
    i++;
  }
  cout<<arr[0];
  cout<<arr[1];
  cout<<arr[2];
  cout<<arr[3];
  cout<<arr[4];
  cout<<arr[5];
  return 0;
}

我期望數字將以升序打印,但是什么也沒有發生。 並告訴我如何一次打印一個數組。 謝謝

您的排序算法不起作用,因為它僅執行一次冒泡排序或插入排序變體。 您的循環中必須再有一個循環,才能重復操作N-1次。

有很多方法可以解釋為什么需要多次通過。 這是一種解釋。 每當我們執行此步驟時:

if (arr[i] > arr[i+1])
{
  int x = arr[i];
  arr[i] = arr[i+1];
  arr[i+1] = x;
}

我們將arr[i+1]元素轉移到arr[i]位置。 這樣,我們有效地跳過arr[i+1]元素。

這就是我的意思。 假設arr[i]稱為xarr[i+1]稱為y,arr[i+2]稱為z 我們從xyz開始,交換xy成為yxz 但是,在循環的下一次迭代中,我們比較xz並忘記了y x在數組中向前移動,向下推y 為什么會有問題呢? 因為yz沒有被比較; 而且這兩個不一定按順序排列!

假設我們有{3,2,0}。 我們比較3和2,並交換它們,得到{2,3,0}。 然后我們繼續比較3和0:交換它們,得到{2,0,3}。 看到問題了嗎? 我們忽略了處理2和0。這需要再次遍歷數組。

有一系列算法可通過重復掃描數組並交換項目來工作。 我建議研究以下該家族中的常見算法: 插入排序選擇排序Shell排序。 還要看一下冒泡排序,以了解為什么它與緊密相關的插入排序或選擇排序相比效果不佳。

  1. 您的循環條件不正確-上一次迭代將比較arr [5]和arr [6],這將使索引超出范圍。

  2. 僅在交換時才更新迭代器“ i”,因此,如果循環遇到arr [i] <= arr [i + 1]的情況,則迭代器將永遠不會更新,並且程序將無限運行。

  3. 您的算法僅實現了冒泡排序的第一個迭代,即它(從左到右)冒泡了最大數量並停止。 所以最終的數組看起來像[1、2、23、4、12、32]

暫無
暫無

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

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