-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQuick.java
More file actions
66 lines (53 loc) · 1.55 KB
/
Quick.java
File metadata and controls
66 lines (53 loc) · 1.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
* This is what I did in the one question in one of our tuts and I thought I might as well use it here,
* to sort my high scores
* @author elan
*
*/
public class Quick
{
public static void sort(Comparable[] array)
{
quicksort(array, 0, array.length - 1);
}
private static void quicksort(Comparable[] array, int start, int end)
{
if(start >= end) return;
int pivot = partition(array, start, end);
quicksort(array, start, pivot - 1);
quicksort(array, pivot + 1, end);
}
private static int partition(Comparable[] array, int start, int end)
{
int pivot = end;
swap(array, median(array, start, end), end);
int wall = start;
for(int i = start; i < end; i++)
{
if(!(array[i].compareTo(array[pivot]) > 0))
{
swap(array, wall, i);
wall++;
}
}
swap(array, pivot, wall);
return wall;
}
private static int median(Comparable[] array, int start, int end)
{
if(end == start + 1) return end;
int mid = (start+end)/2;
if(array[start].compareTo(array[mid]) > 0 && array[start].compareTo(array[end]) < 0 || array[start].compareTo(array[mid]) < 0 && array[start].compareTo(array[end]) > 0)
return start;
if(array[mid].compareTo(array[start]) > 0 && array[mid].compareTo(array[end]) < 0 || array[mid].compareTo(array[start]) < 0 && array[mid].compareTo(array[end]) > 0)
return mid;
return end;
}
private static void swap(Object[] array, int index1, int index2)
{
if (index1 == index2) return;
Object temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}