알고리즘 분석 - 분할 전략
3110 단어 데이터 구조알고리즘 설계 및 분석
분 치 법 은 복잡 한 문 제 를 두 개 이상 의 똑 같 거나 비슷 한 문제 로 나 누 는 것 을 말한다. 이런 서브 문 제 는 서로 독립 되 거나 형식 이 같 으 면 서브 문 제 를 더욱 작은 서브 문제 로 분해 하고 이렇게 순환 해 나 간다. 마지막 에 서브 문 제 는 간단하게 직접 해결 할 수 있 고 원래 의 문 제 는 바로 서브 문 제 를 합 친 것 이다.
예 1.
순서 표를 정 하고 최대 값 과 최소 값 을 구 하 는 분할 알고리즘 을 작성 합 니 다.
분석: 만약 에 우리 의 데이터 가 순서대로 하나의 정형 배열 에 저장 된다 고 가정 하면 배열 의 크기 가 1 이면 결 과 를 직접 제시 할 수 있 습 니 다. 만약 에 크기 가 2 라면 한 번 비교 하면 결 과 를 제시 할 수 있 습 니 다. 만약 에 문 제 를 해결 하 는 배열 의 길이 가 2 보다 크 면 우 리 는 문제 의 규 모 를 줄 이 고 문제 가 해결 할 수 있 을 때 까지 축소 할 수 있 습 니 다. 그래서 분리 전략 알고리즘 은 다음 과 같 습 니 다.
#include "pch.h"
#include
using namespace std;
//s ,e ,meter ,max,min
void partionGet(int s, int e, int *meter, int *max, int *min)
{
if (e - s <= 1)
{
if (meter[s] > meter[e])
{
if (meter[s] > *max)
*max = meter[s];
if (meter[e] < *min)
*min = meter[e];
}
else
{
if (meter[e] > *max)
*max = meter[e];
if (meter[s] < *min)
*min = meter[s];
}
return;
}
int i = s+(e-s) / 2;
partionGet(s, i, meter, max, min);//
partionGet(i+1, e, meter, max, min);
}
int main()
{
int max=0, min=0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
partionGet(0, 9, arr, &max, &min);
cout << max << " " << min << endl;
return 0;
}
질문
예 1, 2
병합 정렬, 쉽게 말 하면 병합 정렬 은 바로 분할 전략 을 이용 한 것 입 니 다. 건물 주 는 병합 정렬 재 귀 알고리즘 과 비 재 귀 알고리즘 에 대한 실현 을 전문 적 으로 쓴 적 이 있 습 니 다. 여기 서 중복 적 으로 쓰 지 않 습 니 다. 연결 을 클릭 하 십시오.
https://mp.csdn.net/postedit/83180119
예 1.
빠 른 정렬 은 분할 정책 을 바탕 으로 정렬 하 는 알고리즘 이다.그 기본 사상 은 주어진 정렬 대기 서열 a [p: r] 에 대해 다음 과 같은 절차 에 따라 진행 하 는 것 이다.
(1) 분해, a [p] 를 기준 으로 배열 a [p: r] 를 3 단 a [p: q - 1], a [q] 와 a [q + 1: r] 로 나 누 어 a [p: q - 1] 중의 모든 요 소 를 a [q] 보다 작 게 하고 a [q + 1: r] 중의 모든 요 소 는 a [q] 보다 크다. 아래 표 q 는 구분 과정 에서 확정 된다.
(2) 재 귀 구 해 는 재 귀 호출 빠 른 정렬 알고리즘 을 통 해 a [p: q - 1] 와 a [q + 1: r] 를 정렬 합 니 다.
(3) 합병, a [p: q - 1] 과 a [q + 1: r] 의 순 서 는 현지에서 진행 되 기 때문에 a [p: q - 1] 와 a [q + 1: r] 가 모두 순 서 를 정 한 후에 어떠한 계산 도 할 필요 가 없습니다. a [p: r] 는 이미 순 서 를 정 했 습 니 다.
이 사상 을 바탕 으로 빠 른 정렬 알고리즘 을 실현 할 수 있 습 니 다.
void quickSort(int arr[], int left, int right)
{// arr ,
if (left < right)//
{
int pivotpos = Partition(arr, left, right, right - left + 1);//
quickSort(arr, left, pivotpos);//
quickSort(arr, pivotpos + 1, right);//
}
n 개의 요 소 를 포함 하 는 배열 arr [0: n] 에 대해 빠 른 정렬 을 하려 면 quickSort (arr, 0, n) 를 호출 하면 됩 니 다.
알고리즘 에서 Partition 은 확 정 된 기준 요소 인 arr [p] 로 하위 배열 arr [p: r] 를 구분 합 니 다.
int Partition(int arr[], int low, int high, int num)
{
int i = low, j = high, pivot = arr[low];//
while (i < j)
{
while (i < j&&arr[j] >= pivot)// , ,
j--;
if (i < j)
{
arr[i] = arr[j];
i++;
}
while (i < j&&arr[i] < pivot)// ,
i++;
if (i < j)
{
arr[j] = arr[i];
j--;
}
}
arr[i] = pivot;//
return i;
}
미완이다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.