특정 코드
#include<stdio.h>
//定位
int Patrition(int* R, int start, int end)
{
int standard = R[start];
int i = start;
int j = end;
//寻找恰当位置(下文会细讲这里)
while(i!=j)
{
while(i<j&&R[j]>=standard) j--;
if(i<j&&R[j]<standard)
{
R[i] = R[j];
i++;
}
while(i<j&&R[i]<=standard) i++;
if(i<j&&R[i]>standard)
{
R[j] = R[i];
j--;
}
}
R[i] = standard;
return i;
}
//这里统一用物理位置来表示
void QuickSort(int* R, int start, int end)
{
if(start<end)
{
int index = Patrition(R,start,end);
QuickSort(R,start,index-1);
QuickSort(R,index+1,end);
}
}
int main()
{
int M[6] = {9,5,3,7,8,4};
QuickSort(M,0,5);
for(int i=0;i<6;i++)
{
printf("%d ", M[i]);
}
}
분석을 처리
빠른 정렬 본질은 그것이 의미 배열, 크기의 순서로 적절한 장소의 개수는 하나의 어레이는 두 개의보다 작은 어레이들로 분할된다. 각 번호까지 이렇게 올바른 위치에 있습니다.
: 퀵 주로 두 부분으로 구성되어
정렬 된 구성을 얻기 위해 순환 방식에 의해, 1 정렬 작업합니다 (이것은 QuickSort). 그 내부 동작을 2 등분, 작은 두 개의 작은 배열을 정렬하고, 마지막으로 전체 배열이 정렬 된 어레이의 제 1 위치 결정 요소이다. (또한, 배열이 경우로 분할되는 경우 여기서 단지 하나 개의 요소, 다시 직접)
2. 위치 결정 동작 (로 patrition), 비교 방법에 의해 하나 하나가,이 수치가 정확한 위치에 배치한다 (예를 들어, 네 번째 요소 A는 소자 A가 제 4 위치에 배치 될 배열 작다). 이러한 동작 후에,이 번호의 왼쪽은 오른쪽 전체가 전체적으로보다 큰 미만이다. (그러나 반드시 순서)
예를 들어, 다음의 배열을 정렬 :
우리는 작은 분할 어레이에서 발생 된 Quicksort 함수로 patrition (위치)와 두 된 Quicksort 동작집니다 호출 할 때.
로 patrition 작업
그리고 코드와 함께, 나는 단계 분석 단계 :
첫 번째 단계는, 대상 선택 (당신이 제공하는 해당 위치를 찾을 수있는 것입니다, 요소, 여기에 내가 첫 번째 요소를 선택)
INT 표준 = R [START];
연속적 준비에서 두번째 단계는 그렇게 포인터 준비 양측 배열 이송 :
I에서 INT = 시작;
INT J = 단부;
세 번째 단계, 단계 코어는 정확한 위치 찾기 :
i와 j가 충족되기 전에 이하 기준보다 다음 왼쪽으로 이동하는 경우, 각각의 선택 소자와, 상기 기준보다 큰 후, 오른쪽으로 이동하는 경우.
반면 (I! = J)
{...}
그러나 요소의 위치가 원래 배열의 데이터를 입력 할 수 없습니다 손실됩니다.
먼저, 첫 번째 요소 (5)의 위치는 첫 번째 위치가 비어 그래서, 당신은 요소를 저장할 수 있습니다, 참고 자료로 사용되어왔다.
필요에 따라, 필요가 오른쪽에서, 참조 요소 J 자격을 참조 3 포인터를, 그래서 모바일 지금 이상 넣어 이하로 시작합니다.
이제, J 콘텐츠를 작성, 이제 포인터 J에 해당하는 위치는 기준보다 더 큰이없는 찾을 수 오른쪽에서 다음, 쓰기가?
분명히, 즉, 지난 7, 7 움직임입니다
지금 오른쪽에서 찾고해야한다, 따라서, 또한 조건 0에 맞춰, 내가 갈 수있는 포인터 (7)의 위치를 작성합니다.
이제 가서 오른쪽으로 쓰기 가능한 위치가 너무 오른쪽 찾고 계속하면 벤치 마크보다 큰 :
포인터 J를 이동해야 지금 무엇을, 6보다 큰 5, 상관없이입니다. 4 ~ 5 시간, 과거에 작성!
이제도 포인터 I, 2 캔을 이동! 1도 가지게 될 수있다!
5 위에 기록하므로,이 위치에 있어야 실제로 기준 소자 (5) 인 것을 나타내는 제가 4 i와 j 포인터 충족 포인터의 시간을 말한다.
위치 결정 완료!
나는 각 단계의 코드 아 역할을 추가합니다 :
while(i<j&&R[j]>=standard) j--; //右指针,如果大于基准条件,就一直向左走
if(i<j&&R[j]<standard) //如果小了,那么就把元素写过去
{ //Ps.另外一边的指针的位置
R[i] = R[j]; //永远是指的可写的
i++; //所以直接R[i] = R[j]
}
while(i<j&&R[i]<=standard) i++;//左指针,如果大于基准条件,就一直向左走
if(i<j&&R[i]>standard) //如果大了,写过去
{
R[j] = R[i];
j--;
}
//继续循环直到i==j (这一堆代码都在while里)
값에 대응하는 위치로 네번째 단계는, (상기 최종도에 대응)
R은 [I] = 표준;
다섯 번째 단계는, 이것은 QuickSort 될 수있는 배열의 양측에 각각, 그리고,이 기준 위치 양측의 대표 분화 된 음을 반환
난을 반환;
이것은 QuickSort
도 위에서 수행 :
어레이의 긴 변을 각각 동일한 동작한다.
정렬 성공!