Thursday, March 10, 2011

Quick sort and Merge sort

Quick sort and Merge sort - both use recursion.


import java.util.*;
public class qs {

int recursionCount = 0;

void quickSort(int arr[]) {
recursionCount = 0;
quickSort(arr, 0, arr.length-1);
}

void quickSort(int arr[], int left, int right) {
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
recursionCount++;
/* partition */
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
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);
}

void mergeSort(int arr[]) {
recursionCount = 0;
mergeSortR(arr);
}

int [] mergeSortR(int arr[]) {
if (arr.length > 1) { // split into two halves
recursionCount++;
int sizeL = arr.length/2;
int sizeR = arr.length - sizeL;
int arrL[] = new int[sizeL];
int arrR[] = new int[sizeR];
for(int i=0; i<sizeL; i++) arrL[i] = arr[i];
for(int i=sizeL; i<sizeL+sizeR; i++) arrR[i-sizeL] = arr[i];
/* recursion */
arrL = mergeSortR(arrL);
arrR = mergeSortR(arrR);

int i = 0, j = 0, k = 0;
while(arrL.length != j && arrR.length != k) {
if(arrL[j] < arrR[k]) {
arr[i] = arrL[j];
i++;
j++;
} else {
arr[i] = arrR[k];
i++;
k++;
}
}
while(arrL.length != j) {
arr[i] = arrL[j];
i++;
j++;
}
while(arrR.length != k) {
arr[i] = arrR[k];
i++;
k++;
}
}
return arr;
}

public qs(){
}


int arr[];
int arrCopy[];
public void init() {
System.out.println(""+getAppletInfo());
System.out.println("quick sort before..., count:"+arr.length);
print();
quickSort(arr);
System.out.println("after...");
print();
System.out.println("recursionCount:"+recursionCount);

for(int i=0; i<arrCopy.length; i++) {
arr[i] = arrCopy[i];
}
System.out.println("merge sort, before..., count:"+arr.length);
print();
mergeSort(arr);
System.out.println("after...");
print();
System.out.println("recursionCount:"+recursionCount);

}

public void print() {
for(int i=0; i<arr.length; i++) {
System.out.print(","+arr[i]);
}
System.out.println("");
}

public String getAppletInfo() {
return "quicksort by Douglas A. Bauman";
}

static public void main(String[] args) {
qs qsi = new qs();
qsi.arr = new int[args.length];
qsi.arrCopy = new int[args.length];
boolean valid = args.length > 0;
for(int i=0; i<args.length; i++) {
try{
qsi.arr[i] = (new Integer(args[i])).intValue();
qsi.arrCopy[i] = qsi.arr[i];
}catch (NumberFormatException e) {
System.out.println("args["+i+"], not a number: "+args[i]);
valid = false;
}
}
if (valid)
qsi.init();
}
}

1 comment:

  1. Elegant quicksort!I am curious about the performance comparisons with other 'split the difference' kinds of sorts.

    ReplyDelete