Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

무작위화를 사용하여 빠른 정렬을 구현하는 C++ 프로그램

<시간/>

퀵 정렬 기술은 목록을 두 부분으로 분리하여 수행됩니다. 처음에 피벗 요소는 분할 알고리즘에 의해 선택됩니다. 피벗의 왼쪽 부분은 피벗보다 작은 값을 보유하고 오른쪽 부분은 더 큰 값을 보유합니다. 분할 후 동일한 절차를 사용하여 각각의 개별 목록이 분할됩니다.

이 경우 우리는 피벗 요소를 무작위로 선택합니다. 피벗을 선택한 후 분할을 수행한 다음 재귀적으로 배열을 정렬합니다.

퀵소트 기법의 복잡성

  • 시간 복잡성 − O(n log n)(최상의 경우 및 평균 경우), O(n 2 ) 최악의 경우.

  • 공간 복잡성 - O(log n)

입력 - 정렬되지 않은 목록:90 45 22 11 22 50
출력 − 정렬 후 배열:11 22 22 45 50 90

알고리즘

파티션(배열, 하위, 상위)

입력 - 데이터 세트 배열, 하한 및 상한

출력 − 올바른 위치에서 회전

시작 인덱스 :=낮은 피벗 :=낮은 범위에서 높은 범위의 i에 대해 높음, 배열[i] <배열[피벗]인 경우 수행한 다음 배열[i] 및 배열[인덱스] 값을 교환합니다. 인덱스 :=인덱스 + 1 array[pivot] 및 array[index]End
값 교환 완료

random_pivot_partition(배열, 하위, 상위)

입력 - 데이터 세트 배열, 하한 및 상한

출력 − 무작위로 선택한 피벗의 최종 인덱스

begin n :=난수 pvt :=lower + n mod (upper – lower + 1) array[pivot]과 array[upper] index의 값을 교환 :=Partition(array, lower, upper) return indexEnd 

quickSort(배열, 왼쪽, 오른쪽)

입력 − 데이터 배열, 배열의 하한 및 상한

출력 - 정렬된 배열

low  

예시 코드

#include#include#include#define MAX 100using namespace std;void random_shuffle(int arr[]) { //배열 요소를 임의의 위치로 섞는 함수 srand(time(NULL )); for (int i =MAX - 1, i> 0, i--) { int j =rand()%(i + 1); 정수 온도 =arr[i]; arr[i] =arr[j]; arr[j] =온도; }}// 피벗 값으로 높은 값을 기반으로 배열 분할 value.int Partition(int a[], int low, int high) { int pivot, index, i; 지수 =낮음; 피벗 =높음; for(i=low; i  

출력

<이전>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 364 3 48 53 54 64 69 77 67 64 69 77 76 77 78 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100