홈>
배열에 10 개의 항목 만있을 때 작동하는 C #에서 퀵 정렬 알고리즘을 만들었습니다. 이 숫자를 늘리면 무한 루프에 빠집니다. 문제가있는 코드는 다음과 같습니다.
while (true)
{
while (((IComparable)arrayToSort[left]).CompareTo(pivot) < 0)
{
left++;
}
while (((IComparable)arrayToSort[right]).CompareTo(pivot) > 0)
{
right--;
}
if (left < right) //This is where the loop becomes infinite.
{
object temp =arrayToSort[right];
arrayToSort[right] = arrayToSort[left];
arrayToSort[left] = temp;
reDrawer.reDrawSample(right, g, arrayToSort, picSamples); //This is used to draw lines that are sorted to make the sorting visual.
reDrawer.reDrawSample(left, g, arrayToSort, picSamples);
refresher.refreshPicture(picSamples); //This is used to refresh the image with the lines.
Thread.Sleep(20);
}
else
{
return right;
}
문장은 거짓이지만 비교하면 둘 다 사실이지만, 그 방법을 볼 수 없습니다. 오른쪽 == 피벗 또는 왼쪽 == 피벗 일 때 발생합니다.
다른 사람이 문제를 볼 수 있습니까?
배열에는 현재 50 개의 변수가 있으며이 문제는 많은 수의 변수에서만 발생합니다. 변수가 50 개 미만인 배열을 사용하고 싶지 않습니다.
전체 방법은 다음과 같습니다.
class Quick_Sort
{
/// <summary>
/// This subroutine creates a pivot and partitions the array accordingly.
/// </summary>
/// <param name="arrayToSort"></param>
/// <param name="left"></param>
/// <param name="right"></param>
/// <returns></returns>
public int partition(ArrayList arrayToSort, int left, int right)
{
int pivot = (int)arrayToSort[left];
ReDrawer reDrawer = new ReDrawer();
Refresher refresher = new Refresher();
while (true)
{
while (((IComparable)arrayToSort[left]).CompareTo(pivot) < 0)
{
left++;
}
while (((IComparable)arrayToSort[right]).CompareTo(pivot) > 0)
{
right--;
}
if (left < right)
{
object temp =arrayToSort[right];
arrayToSort[right] = arrayToSort[left];
arrayToSort[left] = temp;
reDrawer.reDrawSample(right, g, arrayToSort, picSamples);
reDrawer.reDrawSample(left, g, arrayToSort, picSamples);
refresher.refreshPicture(picSamples);
Thread.Sleep(speed);
}
else
{
return right;
}
}
}
/// <summary>
/// This recursive subroutine is responsible for sorting the array into the correct order after the individual partitions have been ordered.
/// </summary>
/// <param name="arr"></param>
/// <param name="left"></param>
/// <param name="right"></param>
public void sortArray(ArrayList arr, int left, int right)
{
if (left < right)
{
int pivot = partition(arr, left, right);
if (pivot > 1)
{
sortArray(arr, left, pivot - 1);
}
if (pivot + 1 < right)
{
sortArray(arr, pivot + 1, right);
}
}
}
}
sortArray가 호출되면 left = 0, right = 49&array는 임의의 50 요소 1 차원 배열입니다.
reDrawer 및 refresher에 대한 참조는 정렬 알고리즘에 영향을 미치지 않고 그림 상자에만 결과를 표시하므로 무시할 수 있습니다.
-
답변 # 1
관련 자료
- while loop - 이 자바를 어떻게 고칠 수 있습니까?
- boolean - 이 람다 조건부를 어떻게 수정할 수 있습니까?
- 이 파이썬 NameError를 어떻게 수정합니까?
- init - 실행되지 않는이 Python 코드를 어떻게 수정할 수 있습니까?
- pass by reference - php - 이 유형 힌트 오류를 어떻게 수정합니까?
- python - 코드를 작게 만들기 위해이 코드를 어떻게 최적화 할 수 있습니까?
- string - 이 자바 프로그램을 인쇄하는 방법은 무엇입니까?
- javascript - Ajax에서 onclick 리스너를 수정하는 방법은 무엇입니까?
- r - 이 인코딩 된 tsv를 구문 분석하는 방법
- python - JSONDecodeError를 수정하는 방법?
- debugging - 위도/경도에 대한이 Lua Haversine 코드가 작동하지 않는 이유는 무엇입니까?
- javascript - 이 구성 요소를 다시 렌더링하는 방법을 모르겠습니다
- c++ - 이 생성자를 어떻게 위임합니까?
- html - 탐색 및 스크롤 메인을 수정하는 방법은 무엇입니까?
- python - 날짜 SQL과 호환되도록이 코드를 단축하려면 어떻게해야합니까?
- javascript - 이 반복되는 var 코드를 어떻게 최적화합니까?
- android - Flutter에서 중앙에 있지 않은 앱 바를 수정하는 방법
- javascript - componentDidMount (React)의 데이터를 사용할 수 있도록 코드를 수정하는 방법
- makefile - "debian-rules-is-dh_make-template"을 수정하는 방법은 무엇입니까?
- angular - 이 코드를 비동기로 변환하려면 어떻게해야합니까?
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- vue.js - axios를 사용하여 서버에 이미지를 업로드하는 방법
- python - 문자열에서 특정 문자 제거
와이즈 비즈
그렇습니다.이 경우 왼쪽/오른쪽으로 증가/감소하지 않습니다. 매번 반복 할 때마다 둘 다 적어도 한 번씩 증가/감소해야합니다.
public int partition(ArrayList arrayToSort, int left, int right) { int pivot = (int)arrayToSort[left]; left--; right++; //To prevent the first iteration from ignoring the outermost elements ReDrawer reDrawer = new ReDrawer(); Refresher refresher = new Refresher(); while (true) { do { left++; }while (((IComparable)arrayToSort[left]).CompareTo(pivot) < 0); do { right--; }while (((IComparable)arrayToSort[right]).CompareTo(pivot) > 0); if (left < right) { object temp =arrayToSort[right]; arrayToSort[right] = arrayToSort[left]; arrayToSort[left] = temp; reDrawer.reDrawSample(right, g, arrayToSort, picSamples); reDrawer.reDrawSample(left, g, arrayToSort, picSamples); refresher.refreshPicture(picSamples); Thread.Sleep(speed); } else { return right; } } }