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演算法有兩種寫法,哪種效率高?
※演算法導論第三版的翻譯水平如何?