c++自學演算法導論 利用遞歸二分法 快速排序 請問哪裡寫v錯了?

#include&
#include&
#include&
#include&
using namespace std;
void MERGE(int*, int, int, int);
void main() {
int A[] = { 2,3,123,41,25,152,523,532,124,213,41,231,23,123,123,123,123,12 };
int L = sizeof(A) / sizeof(int);
MERGE(A, 0, (L - 1) / 2, L - 1);
for (auto i : A)
cout &<&< i &<&< " "; } void MERGE(int*A, int beg, int r, int end) { int n1 = r - beg + 1, n2 = end - r; int*L = new int[n1 + 1]; for (int i = 0; i &< n1; i++) L[i] = A[beg + i]; *(L + n1) = INT_MAX; int*R = new int[n2 + 1]; for (int j = 0; j &< n2; j++) R[j] = A[r + 1 + j]; *(R + n2) = INT_MAX; if (beg != end) { MERGE(L, 0, n1 - 2, (n1 - 2) / 2); MERGE(R, 0, n2 - 2, (n2 - 2) / 2); } for (int i = 1, j = 1, k = beg; k &<= end; k++) if (L[i] &< R[j]) { A[k] = L[i]; i++; } else { A[k] = R[j]; j++; } }


int*R = new int[n2 + 1];

這行,你分配了一個負的大小


錯誤提示已經說明了問題

但更重要的是把當時的局部變數情況貼上來啊,光看錯誤提示只能知道什麼錯不知道哪裡錯啊!

debug也得按基本法啊


錯誤提示已經很清楚地寫了badarraylength

另外這個。。。怎麼看著是歸併排序?


先不說演算法問題

代碼風格看得我受不了

還有string和vector兩個頭文件是賣萌的嗎

問問題請去csdn好嗎


順手給你改了個格式。。。

先不說你演算法哪出問題了

void main()

是個什麼鬼

你 include 了 vector 和 string 不用又是幾個意思?


遞歸Merge後面寫的參數 自己cout一下就知道了,學會自己查。btw, 還有寫注釋寫注釋寫注釋! 你「」學習「「的過程中 變數名最好寫點有意義的名字吧,哪怕st mid ed 也好,以後忘記了回來看一看都會容易想起來吖!還有這好像跟快速排序這個演算法寫法沒什麼關聯吧。coding要靜下心來。


看到這個代碼很熟悉,似乎是歸併排序。。

抱歉孤陋寡聞了。


首先這個不是快排吧。

然後:

if (beg != end){
MERGE(L, 0, n1 - 2, (n1 - 2) / 2);
MERGE(R, 0, n2 - 2, (n2 - 2) / 2);
}

n2-2 &> (n2-2)/2 啊!

程序就像是你的女友:

1.有什麼問題都是你的錯。

2.如果有任何不服的請看第一條。

最好能養成加註釋的習慣,這個其實很重要。


參照偽代碼寫源代碼,看著偽代碼寫了一段之後跑起來,結果正確之後就可以去其他地方玩的。哪怕你完全理解了演算法的意思。

你這段代碼精分得有點嚇人,我甚至懷疑每個循環都不是一個人完成的。我相信大多數人看到你的代碼都會不舒服,請保持你作為一個程序員應該有的強迫症。

有異常就自己去打斷點,不用IDE不會調試打斷點自己去在各個地方去打cout做測試。不要伸手。


推薦閱讀:

Mathematica 是怎麼做不定積分的?能不能用幾個簡單的例子,簡述一下求不定積分的演算法?
程序員如何通過《演算法導論》學習?這本書適不適合演算法基礎薄弱的程序員?
如何生成多個互不重疊的不同半徑圓?
stl partition演算法有兩種寫法,哪種效率高?
演算法導論第三版的翻譯水平如何?

TAG:演算法 | 演算法導論書籍 | C | C標準 | 快速排序 |