2016-04-23 32 views
3

我需要一個程序來排序整數數組而不使用條件語句。數字在0到100的範圍內,不要重複。無條件排序數組

#include <iostream> 
using namespace std; 

int main() { 
    int arr[] = { 34, 12, 24, 65, 63, 22 }; 
    int arraySize = (sizeof(arr)/sizeof(*arr)); 
    unsigned char buf[101] = { 0 }; 

    for (int k = 0; k < arraySize; k++) { 
     buf[arr[k]]++; 
    } 

    unsigned char i = 0; 
    for (int k = 0; k <= 100; k++) { 
     arr[i] = k; 
     i += buf[k]; 
    } 

    for (int a : arr) { 
     cout << a << endl; 
    } 
    system("pause"); 
    return 0; 
} 

該程序的作品,但我得到的錯誤命令提示符的成交後:

運行時檢查失敗#2 - 圍繞堆棧變量「改編」已損壞。

有沒有辦法解決它?

+0

你正在使用哪種編譯器? 「作品」 – Tejendra

+1

可能有點強大。 –

+0

你正在寫出某處的界限。使用調試器並逐行瀏覽代碼,同時關注變量及其值。 –

回答

3

問題是您的代碼寫入數組的末尾。它發生你的計數序列中遇到的最後一個元素之後,但陣列buf之前已經用完,即

for (int k = 0; k <= 100; k++) { 
    arr[i] = k; 
    i += buf[k]; 
} 

當您添加最高的元素,這是65,到結果,i達到6,因此將a[i]分配爲非法。通過在數組中添加一個額外的元素,將其設置爲-1,並觀察發生了什麼(它被設置爲100; demo 1),看看發生了什麼。

您可以通過添加一個提前退出條件,只要您填寫的陣列背停止修復它,即

for (int k = 0; i < arraySize && k <= 100; k++) { 
    arr[i] = k; 
    i += buf[k]; 
} 

現在-1過去我們的數組的「活躍」部分仍然結束 - 1(demo)。

2

第二個循環的邏輯錯誤。你在arr有六個數字,沒有雙打,這意味着buf中共有六個元素將被設置爲1

這意味着,經過一段時間,的i值將是6,通過它來作爲索引使用成arr,但索引6第七數組中的元素,從而導致你寫出界。