[int Array기반 간단한 QuickSort]
- http://www.algolist.net/Algorithms/Sorting/Quicksort 참고.
=>c++ 코드 참조하면.. 한번소트 후에, 끝나면 i가 j보다 크군요..
(j=2, i=3) 이때, j포함 왼쪽. i포함 오른쪽 돌려야 함.
public void quickSort(int arr[], int left, int right) { int i = left, j = right; int tmp; int pivotValue = arr[(left + right) / 2]; /* partition */ while (i <= j) { while (arr[i] < pivotValue) i++; while (arr[j] > pivotValue) j--; if (i <= j) { tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } }; /* recursion */ if (left < j) quickSort(arr, left, j); if (i < right) quickSort(arr, i, right); } public static void main(String args[]){ SortSearch s = new SortSearch(); int A[] = new int[] {9,8,7,6,5,4,3,2,1}; s.quickSort(A, 0, A.length-1); for (int a : A){ System.out.println(a); }
}
-----------아래 건은 연습용------------------
[Simple Quick Sort Example.. with String Array]
- using End element as a temporary Pivot.
public class QuickSort {
void swap(String data[], int i, int j){
String tmp = data[i];
data[i]=data[j];
data[j]=tmp;
}
public void qSort( String[] data, int st, int end){
if (st == end || end < 0) return;
String pivot=data[end]; //Pivot is End (temporary)
int j=end-1;
int i=0;
while (i<j) {
while ( i<j && data[i].compareTo(pivot) < 0 ) i++;
while ( j>i && data[j].compareTo(pivot) > 0) j--;
if (i < j)
swap(data, i, j);
};
System.out.println( "new Pivot:" +i + ","+j);
//IF pivot Largest ?
if ( j == end-1 && data[j].compareTo(pivot) < 0 ) // (j == end-1) =>sometimes wrong. when only 3 data.
qSort(data, 0, end-1);
//General pivot
else {
swap(data, i ,end); //i is real Pivot
qSort(data, 0, i-1); //left divide and conquer:recursive
qSort(data, j+1, end); //right divide and comquer:recursive
}
}
/////////main
public static String datas[]={"adf", "kk", "bb", "aa", "dd", "cc", "ff" };
public static void main(String args[]){
QuickSort q = new QuickSort();
q.qSort(datas, 0, datas.length-1);
for( String a : datas)
System.out.println(a);
}
}