C 언어의 빠른 정렬

특정 코드

#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

도 위에서 수행 :
그림 삽입 설명 여기
어레이의 긴 변을 각각 동일한 동작한다.

그림 삽입 설명 여기
정렬 성공!

성능 분석

그림 삽입 설명 여기

게시 33 개 원래 기사 · 원의 찬양 (40) · 전망 3548

추천

출처blog.csdn.net/qq_43948583/article/details/104399073