상용 정렬 알고리즘 - 병합 정렬
8068 단어 정렬 알고리즘
배열의 요소 개수가 1보다 크면 다음을 수행합니다.
수조를 평균 두 부분으로 나누기;
왼쪽의 수조 병합 정렬;차례로 돌아가다
오른쪽의 수조 병합 정렬;차례로 돌아가다
두 개의 질서정연한 수조를 합병하려면 추가 보조 수조가 필요하며 합병 결과를 잠시 저장해야 한다.되돌아오다
그렇지 않으면 그룹 원소의 개수가 1일 때 이미 질서가 있다.바로 돌아갑니다.
정렬을 안정시키다.시간 복잡도는 최악, 최악, 평균 상황에서 모두 O(N lgN)이고 공간 복잡도는 O(N)이다.
코드:
1 #include <iostream>
2 using namespace std; 3
4 template<typename T>
5 void mergeSortedArray(T src[], int first, int mid, int last, T tmp[]) 6 { 7 int i = first, j = mid + 1; 8 int idx = 0; 9
10 while(i <= mid && j <= last) 11 { 12 tmp[idx++] = src[i] < src[j] ? src[i++] : src[j++]; 13 } 14
15 while(i <= mid) 16 { 17 tmp[idx++] = src[i++]; 18 } 19 while(j <= last) 20 { 21 tmp[idx++] = src[j++]; 22 } 23
24 for(i = 0; i < idx; ++i) 25 { 26 src[first + i] = tmp[i]; 27 } 28 } 29
30 template<typename T>
31 void mergeSort(T src[], int first, int last, T tmp[]) 32 { 33 if(first >= last) 34 return; 35
36 int mid = first + ((last - first) >> 1); // , 37
38 mergeSort(src, first, mid, tmp); // 39 mergeSort(src, mid + 1, last, tmp); 40
41 mergeSortedArray(src, first, mid, last, tmp); // ,tmp , 42 } 43
44 int main() 45 { 46 const int n = 5; 47
48 int ia[n] = {1, 3, 6, 2, 4}; 49 int itmp[n]; 50 mergeSort(ia, 0, n - 1, itmp); //sort
51 for(int i = 0; i < n; ++i) 52 cout << ia[i] << ' '; 53 cout << endl; 54
55 double da[n] = {1.2, 3.4, 6.7, 2.3, 4.5}; 56 double dtmp[n]; 57 mergeSort(da, 0, n - 1, dtmp); //sort
58 for(int i = 0; i < n; ++i) 59 cout << da[i] << ' '; 60 cout << endl;
61 return 0;
62 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WEEK. 01 2022.04.03 TIL정렬(sorting)이란 이름, 학번, 학점 등의 키(key)를 항목값의 대소 관계에 따라 데이터 집합을 일정한 순서로 바꾸어 늘어놓는 작업을 의미함. 정렬 알고리즘은 안정적인 알고리즘과 그렇지 않은 알고리즘으로 나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.