-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathq10p0_sort.java
More file actions
157 lines (143 loc) · 4.38 KB
/
Copy pathq10p0_sort.java
File metadata and controls
157 lines (143 loc) · 4.38 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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import java.util.*;
public class q10p0_sort{
public static void main(String[] args){
int[] test = {9,1,12,14,8,3,2,11,10,5,6,4,7,13};
LinkedList<Integer> link = new LinkedList<>();
for(int i: test){
link.add(i);
System.out.print(i+" ");
}
System.out.println("");
//sort.bubble(test);
//sort.selection(test);
//link = sort.merge(link);
//sort.quick(test);
//sort.radix(test);
//for(Integer i: link)
//for(int i: test)
// System.out.print(i+" ");
//System.out.println("");
System.out.println(sort.buck(test));
}
}
class sort{
// T: O(n^2)
// S: O(1)
public static void bubble(int[] arr){
for(int i = 0; i<arr.length; i++){
for(int j = 0; j<arr.length-1-i; j++){
if(arr[j] > arr[j+1])
swap(arr, j, j+1);
}
}
}
public static void swap(int[] arr, int a, int b){
if(a != b){
arr[a] = arr[a] + arr[b];
arr[b] = arr[a] - arr[b];
arr[a] = arr[a] - arr[b];
}
}
/*-----------------------------------------------*/
// T: O(n^2)
// S: O(1)
public static void selection(int[] arr){
for(int i = 0; i < arr.length; i++){
int min = getMin(arr, i, arr.length);
swap(arr, min, i);
}
}
public static int getMin(int[] arr, int start, int len){
int min = start;
for(int i = start; i < len; i++){
if(arr[i]< arr[min])
min = i;
}
return min;
}
/*-----------------------------------------------*/
// T: O(nlgn)
// S: O(nlgn), can be reduced to O(n).
// For merge algorithm, key point is as combine part.
public static LinkedList<Integer> merge(LinkedList<Integer> link){
int len = link.size();
if(len>1){
LinkedList<Integer> left = new LinkedList<>();
LinkedList<Integer> right = new LinkedList<>();
int mid = (len-1)/2;
for(int i=0; i<len; i++){
if(i<=mid)
left.add(link.get(i));
else
right.add(link.get(i));
}
return combine(merge(left), merge(right));
}
return link;
}
public static LinkedList<Integer> combine(LinkedList<Integer> left, LinkedList<Integer> right){
LinkedList<Integer> total = new LinkedList<>();
while(left.size() != 0 && right.size() != 0){
if(left.peek() <= right.peek())
total.add(left.pop());
else
total.add(right.pop());
}
while(left.size() != 0){
total.add(left.pop());
}
while(right.size() != 0){
total.add(right.pop());
}
return total;
}
/*-----------------------------------------------*/
public static void quick(int[] arr){
quick(arr, 0, arr.length-1);
}
public static void quick(int[] arr, int left, int right){
int index = sort(left, right, arr);
if(left < index -1)
quick(arr, left, index-1);
if(index < right)
quick(arr, index, right);
}
// inline exchange, difficult to understand....
public static int sort(int left, int right, int[] arr){
int pivot = arr[(left+right)/2];
while(left <= right){
while(arr[left] < pivot)
left++;
while(arr[right] > pivot)
right--;
if(left <= right){
swap(arr, left, right);
left++;
right--;
}
}
return left;
}
/*-----------------------------------------------*/
public static void radix(int[] arr){
}
/*-----------------------------------------------*/
public static ArrayList<Integer> buck(int[] arr){
int range = 20;
int[] bucks = new int[20];
Arrays.fill(bucks, 0);
for(int i = 0; i<arr.length; i++){
bucks[arr[i]]++;
}
ArrayList<Integer> ans = new ArrayList<>();
for(int i = 0; i<bucks.length; i++){
if(bucks[i] != 0){
while(bucks[i] != 0){
ans.add(i);
bucks[i]--;
}
}
}
return ans;
}
}