빠른 정렬 알고리즘 개념
빠른 정렬은 일반적으로 재귀 구현을 기반으로합니다. 아이디어는 다음과 같습니다.
1. 적절한 값을 선택하십시오 (이상적인 값은 최고이지만 배열의 첫 번째 값은 일반적으로 구현에서 사용됩니다) ( "피벗"이라고합니다.
2.이 값에 따라 배열을 두 부분으로 나누고 왼쪽의 작은 부분과 오른쪽의 큰 부분을 나누십시오.
3. 그러한 라운드 후에이 피벗의 위치는 최종 위치에 있어야한다는 것이 확실합니다.
4. 배열 당 하나의 요소 만있을 때까지 두 서브 어레이에 대한 위의 프로세스를 반복하십시오.
5. 정렬이 완료되었습니다.
기본 구현 방법 :
public static void QuickSort (int [] arr) {qsort (arr, 0, arr.length-1);} private static void qsort (int [] arr, int low, int high) {if (low <high) {int pivot = partition (arr, low, high); // 배열을 두 부분으로 나눕니다 QSORT (ARR, LOW, PIVOT-1); // 왼쪽 서브 어레이 QSORT를 정렬합니다 (ARR, PIVOT+1, HIGH); // 오른쪽 서브 어레이를 재귀 적으로 정렬}} private static int partition (int [] arr, int low, int high) {int pivot = arr [low]; // 피벗 레코드 while (low <high) {while (low <high && arr [why]> = pivot) -높이; ARR [LOW] = ARR [High]; // 왼쪽으로 피벗보다 작은 레코드를 교환하는 동안 (낮음 <high && arr [low] <= pivot) ++ low; ARR [High] = ARR [낮음]; // 오른쪽 끝까지 피벗보다 작은 레코드를 교환} // 스캔이 완료되었고 피벗이 arr [low] = pivot; // 피벗의 위치를 반환으로 반환합니다.}제네릭을 사용하여 빠른 주문 알고리즘을 구현하십시오
아래는 모든 유형의 배열을 정렬 할 수있는 정적 함수 정렬 ()을 포함하는 QuickSort 클래스입니다. 객체 유형의 배열 인 경우 객체 유형은 비교 기능을 비교하기 위해 비교 가능한 인터페이스를 구현해야합니다.
가장 기본적인 빠른 열 분류 알고리즘이 사용되었으며 최적화 처리는 수행되지 않았습니다.
소스 코드는 다음과 같습니다.
import java.util.linkedlist; import java.util.list; import java.util.listiterator; import java.util.random; Public Class QuickSort {@suppresswarnings ( "Checked") // 위의 Quick-Row 함수 프로토 타입을 수정하여 객체 유형의 배열을 정렬 할 수 있습니다. 이 기능은 내부적으로 사용되며 외부 정렬 함수 인터페이스는 SORT ()입니다. 정렬 함수는 객체가 컴파일 타임 유형 감지를 제공 할 수있는 비슷한 인터페이스를 구현해야합니다. 다음 기사를 참조하십시오. 개인 정적 void QuickSort (Object [] in, int begin, int end) {if (시작 == end || 시작 == (END-1)) return; 객체 p = [시작]; int a = 시작 +1; int b = a; for (; b <end; b ++) {//이 객체 유형 배열은 비교를 위해 비교 함수를 사용하여 ([b])에서 비교를 위해 비교 함수를 사용할 수 있도록 비교 가능한 인터페이스를 구현해야합니다. 계속;} 대상 임시 = [a]; [a] = [b]에서; [b] = 온도에서; A ++; }}에서 [시작] = [A-1]에서; [A-1] = P에서; if (a-1> 시작) {QuickSort (in, begin, a); } if (end-1> a) {QuickSort (in, a, end); } 반품; } // generics를 사용하여 모든 객체 배열을 정렬하면 객체 유형 배열은 비슷한 인터페이스 public static <t를 비슷한 <? super t >> void sort (t [] input) {QuickSort (입력, 0, input.length); } // 정렬 목록 객체의 함수 추가, Java.util.collections 클래스의 sort () 함수를 참조하십시오. public static <t는 비슷한 <? super t >> void sort (list <t> list) {object [] t = list.toarray (); // 목록을 배열 QuickSort (t, 0, t.length)로 변환합니다. // 배열 정렬 // 배열 정렬이 완료된 후 목록에 다시 쓸 수 있습니다. listIterator <T> i = list.listIterator (); for (int j = 0; j <t.length; j ++) {i.next (); I. 세트 ((t) t [j]); }} // 제네릭은 Java, Primitive Data Type (int, double, byte 등)에서 사용할 수 없기 때문에 기능 과부하 메커니즘을 사용하여 이러한 기본 배열 (int [], double [], byte [] 등을 정렬 할 수 있습니다. 동일한 정렬 함수를 공유하려면 원래 유형 (자가 옥스, Unboxing) 메커니즘을 사용하여 해당 객체 유형으로 캡슐화하고 새 객체 배열을 형성 한 다음 분류 한 다음 Deencapulate입니다. 이의 단점은 캡슐화 된 배열을 저장하기 위해 추가 변환 단계와 추가 공간이 필요하다는 것입니다. 다른 방법은 정렬 코드를 각 과부하 기능으로 복사하는 것입니다. 공식 API의 java.util.arrays 클래스의 정렬 () 함수는이 방법을 사용하며,이 방법은 배열 클래스의 소스 코드에서 볼 수 있습니다. public static void sort (int [] input) {integer [] t = new Integer [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = input [i]; // 캡슐화} QuickSort (t, 0, t.length); // sorting for (int i = 0; i <input.length; i ++) {input [i] = t [i]; // uncapsulation} // overload 함수 [] double [] double int 정렬 (double [] input) {double [] t = new Double [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = 입력 [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {input [i] = t [i]; }} // 바이트의 과부하 기능 [] 배열 공개 정적 무효 정렬 (byte [] input) {byte [] t = new Byte [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = 입력 [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {t [i] = 입력 [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length); 입력. 길이; i ++) {입력 [i] = t [i]; }} // short [] 오버로드 함수 public static void sort (short [] input) {short [] t = new short [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = 입력 [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {input [i] = t [i]; }} // short [] 오버로드 함수 public static void sort (char [] input) {문자 [] t = 새 문자 [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = 입력 [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {input [i] = t [i]; }} // float [] 배열의 과부하 함수 public static void sort (float [] input) {float [] t = new float [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = 입력 [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {input [i] = t [i]; }} // public static void main (string [] args) 테스트를위한 기본 함수 {// int [] 배열을 생성 int [] 배열 int len = 10을 테스트하기 위해 임의의 숫자로 구성됩니다. int [] input = new int [len]; 랜덤 r = 새로운 랜덤 (); System.out.print ( "int [] 정렬 전 :"); for (int i = 0; i <input.length; i ++) {input [i] = r.nextint (10*len); System.out.print (입력 [i] + ""); } system.out.println (); System.out.print ( "int [] 정렬 후 :"); 정렬 (입력); for (int i : input) {system.out.print (i + ""); } system.out.println (); // String을 테스트하기 위해 문자열 배열을 생성합니다 [] s = new String [] { "b", "a", "e", "d", "f", "c"}; System.out.print ( "String [] 정렬 전 :"); for (int i = 0; i <s.length; i ++) {system.out.print (s [i]+""); } system.out.println (); System.out.print ( "String [] 정렬 후 :"); 정렬 (들); for (int i = 0; i <s.length; i ++) {system.out.print (s [i]+""); } system.out.println (); // 테스트 목록에 문자열 목록을 생성합니다 <string> l = new LinkedList <string> (); s = new String [] { "b", "a", "e", "d", "f", "c"}; System.out.print ( "링크드리스트 <문자열> 정렬 전 :"); for (int j = 0; j <s.length; j ++) {l.add (s [j]); System.out.print (s [j] + ""); } system.out.println (); 정렬 (l); System.out.print ( "링크드리스트 <문자열> 정렬 후 :"); for (string ts : l) {system.out.print (ts + ""); } system.out.println (); }}기본 기능 테스트를 실행하고 출력에서 QuickSort 클래스가 정상적으로 작동하고 있음을 알 수 있습니다.
int [] 정렬 전 : 65 48 92 26 3 8 59 21 16 45int [] 정렬 후 : 3 8 16 21 26 45 48 59 65 92String [] 정렬 전 : BAEDFC String [] 정렬 후 : ABCDEF LinkedList <string> 정렬하기 전에 : BAEDFC LinkedList <string> : ABCDEF : ABCDEF