[英]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]
稱為x , arr[i+1]
稱為y,而arr[i+2]
稱為z 。 我們從xyz開始,交換x和y成為yxz 。 但是,在循環的下一次迭代中,我們比較x和z並忘記了y ; x在數組中向前移動,向下推y 。 為什么會有問題呢? 因為y和z沒有被比較; 而且這兩個不一定按順序排列!
假設我們有{3,2,0}。 我們比較3和2,並交換它們,得到{2,3,0}。 然后我們繼續比較3和0:交換它們,得到{2,0,3}。 看到問題了嗎? 我們忽略了處理2和0。這需要再次遍歷數組。
有一系列算法可通過重復掃描數組並交換項目來工作。 我建議研究以下該家族中的常見算法: 插入排序 , 選擇排序和Shell排序。 還要看一下冒泡排序,以了解為什么它與緊密相關的插入排序或選擇排序相比效果不佳。
您的循環條件不正確-上一次迭代將比較arr [5]和arr [6],這將使索引超出范圍。
僅在交換時才更新迭代器“ i”,因此,如果循環遇到arr [i] <= arr [i + 1]的情況,則迭代器將永遠不會更新,並且程序將無限運行。
您的算法僅實現了冒泡排序的第一個迭代,即它(從左到右)冒泡了最大數量並停止。 所以最終的數組看起來像[1、2、23、4、12、32]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.