2012-08-30 2 views
0

배열의 버블 정렬을 구현하는이 코드 조각이 있습니다.벡터 첨자가 범위를 벗어났습니다 - 버블 정렬

UPD : 은이 시점까지 작동 2012 MS VS에서 컴파일되는 나는 충돌이 발생하는 정확한 장소를 추적 검사를 많이 추가했습니다,있는 IT는 다음과 같이이다 : 그것은 처음 두 요소를 교환합니다 배열로, 이러한 요소가 교체로 배열 한 다음 그것을 출력합니다 "확인"하고 있지만, 내 손이 닿지 않는, 뭔가 정말 간단해야합니다

#include "stdafx.h" 
#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 
#include <vector> 
using namespace std; 


int Check(vector<int> Array) 
{ 
printf ("Checking: \n"); 
for (int i = 0; i < Array.size(); i++) 
    if((int*) Array[i] == NULL) 
    { 
     cerr << "Array [" << i << "] is fubared"; 
     return -1; 
    } 
} 

int PrintOut(vector<int> Array) 
{ 
printf ("Your array appears to be as follows: \n"); 
for (int i = 0; i < Array.size(); i++) 
    printf("%d ", Array[i]); 
return 0; 
} 

int bubble_sort() 
{ 
int or_size = 2; 
int i, j, size, temp; 

printf("Specify array size\n"); 
scanf_s("%d", &size); 
printf(" Now, input all elements of the array \n"); 

vector<int> Array(size, 0); 
if (size > or_size) 
    Array.resize(size); 

for (i = 0; i < size; i++) 
{ 
    printf("Array [%d] is now re-initialised as ", i); 
    scanf_s("%d", &temp); 
    printf("\n"); 
    Array[i] = temp; 
} 

Check(Array); 

PrintOut(Array); 

for (i = 1; i < size; i++) 
    for (j = 0; j < size-i ; j--) 
    { 
     printf ("Attempting to swap Array[%d], which = %d, and Array [%d], which = %d \n",j, Array[j], j+1, Array[j+1]); 
     if (Array[j] > Array[j+1]) 
     { 
      Array[j]+=Array[j+1]; 
      Array[j+1] = Array[j] - Array[j+1]; 
      Array[j] = Array[j] - Array[j+1]; 
      printf("Swapped \n"); 
     } 
     PrintOut(Array); 
     Check(Array); 
    } 

printf ("\n Your Array has been bubble_sorted and should know look like this: \n"); 
for (i = 0; i < size; i++) 
    printf("%d ", Array[i]); 

Array.clear(); 

return 0; 
} 

int main() 
{ 
    bubble_sort(); 
    return 0; 
} 

"범위를 벗어 벡터 첨자"와 충돌 출력한다 . PS 없음 당황 _asm 지금 ;-)

+0

어디에서 충돌이 발생합니까? – jakev

+0

왜 당신은 asm으로 귀찮게합니까? 컴파일러는 가능한 한 그 코드를 훌륭하게 만들 수 있습니다. –

+0

'for (j = size; ...) '루프에서 루프 변수 문제가 있다고 생각합니다 ... 실제로 두 개가 있습니다. 하나는'j' 대신'i'를 사용하고, 다른 하나는' 배열의 끝을 지나가는'size'를 사용하십시오. – twalberg

답변

2

당신 "는있어 한 번에 하나씩 '오류 :

for (i = 0; i < size; i++) 
    for (j = size; i > 0; i--) 
    // ^^^^ 
    // j is out or range, the last valid index is size-1 
     if (Array[j] < Array[j-1]) 
      swap(Array[j], Array[j-1]); 
+0

감사합니다. 지금 사용해보세요. – Chiffa

3
for (j = size; i > 0; i--) 

해야 치수 N의 인덱스의 배열에 대한

for (j = size - 1; i > 0; i--) 

는 0에서 N로 이동되었다 - 1

+1

나는이 코드에서'i'와'j's가 섞여 있다고 느낀다. – Useless

+0

네, 고마워. 지금 당장은 제대로 작동합니다! – Chiffa

관련 문제