상용 정렬 알고리즘 요약 분석
n 으로 규 모 를 정 한 배열 은 n 개의 숫자 에서 가장 작은 하 나 를 찾 은 다음 0 위의 숫자 와 교환 한 다음 n - 1 개의 숫자 에서 가장 작은 것 을 찾 아 첫 번 째 위치의 숫자 와 교환 합 니 다.i 번 을 교환 한 후에 배열 왼쪽 의 i 개의 숫자 는 질서 가 있 고 오른쪽 n - i 개의 숫자 는 순서 가 없다.그리고 n - i 숫자 에서 가장 작은, i 위치 와 의 숫자 교환 위 치 를 찾 습 니 다.n 번 교환 한 후에 전체 배열 이 질서 가 있 습 니 다.
시간 복잡 도: O (n)²)
실현:
public class Selection{
public static void sort(int[] a) {
int t;
for(int i=0;i<a.length;i++){
int index=i;//
for(int j=i+1;j<a.length;j++){
if(a[index]>a[j]){//
index=j;
}
}
//
t=a[i];
a[i]=a[index];
a[index]=t;
}
}
}
삽입 정렬
n 규모 의 배열 을 지정 하고 i 번 (i) 을 지정 합 니 다.
public class Insertion{
public static void sort(int[] a) {
int t=0;
for(int i=1;i<a.length;i++){
int v=a[i],k;
for(k=i-1;k>=0&&v<a[k];k--){// a[i] , 。
a[k+1]=a[k];
}
a[k+1]=v;// a[i] a[i]
}
}
}
힐 정렬
삽입 정렬 에 따라 n 개 요소 중 가장 작은 숫자 가 오른쪽 끝 에 있다 면 n - 1 번 을 비교 해 야 목표 위치 에 도달 할 수 있 습 니 다. 요소 의 크기 를 하나씩 비교 하기 때 문 입 니 다. 각각 1 개 를 비교 하고 이동 하 며 1 개 를 비교 하고 이동 하 며 h 개 를 비교 하고 이동 하면 가장 오른쪽 요소 가 목표 위치 로 이동 하 는 횟수 를 비교 합 니 다.큰 폭 으로 줄 어 듭 니 다. 따라서 h 개의 요 소 를 비교 이동 한 후에 n 개의 수 는 n / h 개의 질서 있 는 쌍 이 나타 납 니 다. 그들 은 서로 h 를 사이 에 두 고 h – 를 비교 한 다음 에 h = 1 까지 이동 한 후에 정렬 이 끝 납 니 다. 정렬 을 삽입 하면 h = 1 의 힐 정렬 입 니 다. 시간 복잡 도: 알 수 없 는 적용 범위: 데이터 규모 가 크 고 데이터 가 분 산 됩 니 다.실현:
public class Shell {
public static void sort(int[] a){
int h=1,t=0;
h=a.length/2;
while(h>=1){// 1 ,
for(int i=h-1,j;i<a.length;i++){// i , h , h-1 , h ,
int base=a[i];//
for(j=i-h;j>=0&&a[j]>base;j-=h){// , , h
a[j+h]=a[j];
}
a[j+h]=base;//
}
h/=2;//
}
// display(a);
}
}
정렬
재 귀적 인 방식 을 통 해 n 개의 요소 등 을 두 부분 으로 나 눈 다음 에 이 두 부분 등 을 네 부분 으로 나 누 었 다. 이런 식 으로 유추 하면 n 개의 요 소 를 n 개의 단독 그룹 으로 나 누 는 것 을 알 수 있다. 이 n 개의 그룹 은 하나의 요소 만 있 기 때문에 질서 가 있다. 그리고 그 중에서 인접 한 두 그룹 을 합병 시 키 고 합병 후의 그룹 도 질서 가 있어 n / 2 개의 그룹 을 형성 했다. 그 다음 에 인접 한 두 그룹 을 합병 시 켰 다.조합 하여 n / 4 개의 그룹 을 만 듭 니 다. 이 를 통 해 하나의 그룹 으로 합 쳐 정렬 이 완료 되 었 음 을 알 수 있 습 니 다. 두 그룹 을 합 쳤 을 때 두 개의 바늘 을 두 배열 의 첫 번 째 위 치 를 가리 키 고 크기 를 비교 하여 작은 것 을 임시 배열 에 넣 은 다음 이 지침 을 뒤로 이동 할 수 있 습 니 다. 그 중 한 배열 의 바늘 이 가장 오른쪽 에 있 으 면 다른 배열 의 나머지 요 소 를 임 의 배열 로 복사 할 수 있 습 니 다.시간 배열. 과정 은 다음 과 같다. 시간 복잡 도: O (nlgn) 단점: 원래 배열 과 같은 크기 의 보조 배열 을 열 어야 한다.
public class Merge {
static int[] temp=null;
public static void sort(int[] a){
int start,end;
temp=new int[a.length];
start=0;
end=a.length-1;
merge(a,start,end);
// display(a);
}
public static void merge(int[] a,int start,int end){
if(start==end)
return;
int mid=(start+end)/2;
merge(a,start,mid);// ,
merge(a,mid+1,end);
if(a[mid]<a[mid+1])// , ,
return;
mergeSort(a,start,end);
}
public static void mergeSort(int[] a,int start,int end){
int mid=(start+end)/2;
for(int i=start,j=mid+1,k=start;k<=end;k++){//i,j ( , )
if(i>mid) temp[k]=a[j++];// ,
else if(j>end) temp[k]=a[i++];// ,
else if(a[i]<a[j]) temp[k]=a[i++];// i , a[i] , i
else temp[k]=a[j++];// j , a[j] , j
}
System.arraycopy(temp, start, a, start, end-start+1);//
}
public static void display(int[] a){
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
}
빠 른 정렬
1. n 개 수 를 정 하고 start 에서 end 까지 정렬 2. 왼쪽 에서 오른쪽으로 i 만족 a [i] > a [start] 3 을 찾 습 니 다. 오른쪽 에서 왼쪽으로 j 만족 a [j] > a [start] 4 를 찾 습 니 다. a [i] 와 a [j] 5 를 교환 하고 3, 4 를 반복 합 니 다. i > = j 6, 교환 a [start] 와 a [j] 를 찾 습 니 다. 이때 만족 a [0 ~ j - 1] 는 a [j] 보다 작 습 니 다. a [j + 1, end] 는 모두 a [j] 보다 큽 니 다.7. 1 에서 다시 실행 합 니 다. 이때 start = start, end = j - 1 과 start = j + 1, end = end 까지 start > = end 프로 세 스 그림: 시간 복잡 도 (평균): O (nlgn) 적용 범위: 중복 숫자 가 적 고 질서 있 는 숫자 가 적 습 니 다.
public class Quick {
public static void sort(int[] a) {
sort(a, 0, a.length - 1);
}
private static void sort(int[] a, int start, int end) {
if (start >= end)
return;
int i = partition(a, start, end);// , i [start,i-1], [i+1,end]
sort(a, start, i - 1);
sort(a, i + 1, end);
}
private static int partition(int[] a, int start, int end) {// ,
int i = start + 1, j = end;
i = start;
j = end + 1;
int value=a[start];
while (true) {
while (a[++i] < value)
// a[start]
if (i == end)
break;
while (a[--j] > value);// a[start] , a[start], j>start
// if (j == start)
// break;
if (i >= j)// i,j i>j,
break;
swap(a, i, j);
}
// j a[j] ,
// a[j] a[start] j start
// a[i] a[start] i end
// ,i j ,a[j] a[start] , a[i], a[i] a[start]
// a[j]>a[start], j ( j a[start] , , )
// a[start] , a[j] a[start]
swap(a, j, start);
return j;
}
private static void swap(int[] a, int p, int q) {
int t = a[p];
a[p] = a[q];
a[q] = t;
}
}
더미 정렬
(이 진 트 리) 질서 있 는 정의: 이 진 트 리 에서 모든 부모 노드 가 하위 노드 보다 작 지 않 으 면 이 이 진 트 리 는 질서 있 는 잠수 작업 정의 이다. 만약 에 한 부모 노드 가 두 개의 키 노드 나 하위 노드 중의 하나 보다 크 면 부모 노드 와 하위 노드 중의 큰 위 치 를 교환 한 다음 에 이전의 부모 노드 를(현재 하위 노드 의 위치 로 교환 되 었 습 니 다) 새로운 하위 노드 와 비교 하고 교환 합 니 다. 이 노드 가 하위 노드 보다 크다 는 것 을 알 면 작업 을 끝 냅 니 다. 이 조작 을 하 잠 작업 이 라 고 합 니 다.
질서 있 는 더미 에 대해 서 는 번호 가 0 인 노드 가 가장 큰 요소 일 것 입 니 다. 이 요 소 를 제거 하고 마지막 요 소 를 0 위치 에 두 면 이 더 미 는 무질서 한 더미 가 됩 니 다. 그 다음 에 0 노드 에 대해 잠수 작업 을 한 다음 에 이 더 미 는 질서 있 는 더미 가 되 었 습 니 다. 그 다음 에 계속 제거 하고 정렬 을 한 다음 에 이 더미 의 크기 는 0 이 고 원래 배열 의 위 치 는 질서 있 는 순서 로 바 뀌 었 습 니 다. 이 더 미 는 질서 있 는 순서 로 바 뀌 었 습 니 다.그림 은 질서 있 게 쌓 인 최대 요 소 를 제거 하고 정렬 하여 최종 적 으로 질서 있 는 수열 을 얻 는 과정 입 니 다. 그러면 다음 문 제 는 무질서 한 더 미 를 어떻게 질서 있 게 쌓 느 냐 하 는 것 입 니 다. 한 더 미 를 아래 에서 위로 내 려 오 면 최종 적 으로 질서 있 는 더 미 를 만 드 는 것 입 니 다. 마지막 노드 는 하위 노드 가 없 기 때문에 내 려 오 는 작업 을 할 필요 가 없습니다. 꼴찌 2 층 에서마지막 노드 에서 잠수 작업 을 시작 하고 첫 번 째 요 소 를 알 면 질서 있 는 더 미 를 형성 할 수 있다. 과정 은 다음 과 같다.
알고리즘 복잡 도: O (nlgn)
실현:
public class Heap {
//
//
// 0
// 1 2
// 3 4 5 6
//
// , n ( ) n/2⌉-1, ( ) n*2+1 n*2+2
// n , (n+1)/2⌉+1
public static void sort(int[] a) {
int n = a.length;
for (int k = (int) (Math.ceil((double) (n + 1) / 2) + 1); k >= 0; k--)
//
sink(a, k, n);
while (n > 1) {
swap(a, 0, --n);
sink(a, 0, n);
}
}
public static void sink(int[] a, int k, int n) {//
while (k * 2 + 2 < n) {
int j = k * 2 + 1;// j
if (a[j] < a[j + 1])//
j++;// j
if (a[k] > a[j])// , ,
break;
swap(a, k, j);//
k = j;
}
}
private static void swap(int[] a, int p, int q) {
int t = a[p];
a[p] = a[q];
a[q] = t;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.