Skip to content

Commit 6dce772

Browse files
author
FAREAST\v-wenwli
committed
Quick sort, shell sort
1 parent 4db75c2 commit 6dce772

File tree

4 files changed

+192
-1
lines changed

4 files changed

+192
-1
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*****************************************************************
2+
* Quick sort
3+
*
4+
* @author liwenwei
5+
*
6+
****************************************************************/
7+
package com.liwenwei.algs4.code;
8+
9+
import java.util.Arrays;
10+
11+
public class Quick {
12+
13+
private Quick() {
14+
15+
}
16+
17+
private static int partition(Comparable[] a, int low, int high) {
18+
int i = low, j = high + 1;
19+
Comparable v = a[low];
20+
while (true) {
21+
while (less(a[++i], v)) if (i == high) break;
22+
while (less(v, a[--j])) if (j == low) break;
23+
if (i > j) break;
24+
exch(a, i, j);
25+
}
26+
exch(a, low, j);
27+
return j;
28+
}
29+
30+
public static void sort(Comparable[] a) {
31+
sort(a, 0, a.length - 1);
32+
}
33+
34+
private static void sort(Comparable[] a, int low, int high) {
35+
if (low > high) return;
36+
int j = partition(a, low, high);
37+
sort(a, low, j - 1);
38+
sort(a, j + 1, high);
39+
}
40+
41+
private static boolean less(Comparable v, Comparable w) {
42+
return v.compareTo(w) < 0;
43+
}
44+
45+
private static void exch(Comparable[] a, int i, int j) {
46+
Comparable t = a[i];
47+
a[i] = a[j];
48+
a[j] = t;
49+
}
50+
51+
public static boolean isSorted(Comparable[] a) {
52+
for (int i = 1; i < a.length; i++) {
53+
if (less(a[i], a[i - 1]))
54+
return false;
55+
}
56+
return true;
57+
}
58+
59+
public static void main(String[] args) {
60+
Integer[] a = { 6, 4, 10, 9, 7, 7, 8, 10, 8, 9, 10 };
61+
Shell.sort(a);
62+
System.out.println(Arrays.toString(a));
63+
}
64+
}

java/sort/MergeSort.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package sort;
2+
3+
import java.util.Arrays;
4+
5+
public class MergeSort {
6+
7+
private static int[] aue;
8+
9+
private static void merge(int[] arr, int lo, int hi) {
10+
int mid = (hi - lo) / 2 + lo;
11+
int i = lo;
12+
int j = mid + 1;
13+
// 复制arr[low, high]到aue
14+
for (int k = lo; k <= hi; k++) {
15+
aue[k] = arr[k];
16+
}
17+
18+
/*
19+
* 4个判断条件:
20+
* - 左边取完取右边
21+
* - 右边取完取左边
22+
* - 如果左边当前值大于右边当前值,取右边
23+
* - 如果右边当前值大于左边当前值,取左边
24+
*/
25+
for (int k = lo; k <= hi; k++) {
26+
if (i > mid) {
27+
arr[k] = aue[j++];
28+
} else if (j > hi) {
29+
arr[k] = aue[i++];
30+
} else if (aue[i] > aue[j]) {
31+
arr[k] = aue[j++];
32+
} else {
33+
arr[k] = aue[i++];
34+
}
35+
}
36+
}
37+
38+
private static void sort(int[] arr, int lo, int hi) {
39+
if (lo >= hi) return;
40+
int mid = (hi - lo) / 2 + lo;
41+
sort(arr, lo, mid); // Sort arr[low, mid]
42+
sort(arr, mid + 1, hi); // Sott arr[mid+1, high]
43+
merge(arr, lo, hi);
44+
}
45+
46+
public static void sort(int[] arr) {
47+
aue = new int[arr.length];
48+
sort(arr, 0, arr.length - 1);
49+
}
50+
51+
public static void main(String[] args) {
52+
int[] arr = { 2, 1, 5, 9, 4, 3, 2};
53+
sort(arr);
54+
System.out.println(Arrays.toString(arr));
55+
}
56+
57+
}

java/sort/QuickSort.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,42 @@
55
***********************************************************************/
66
package sort;
77

8-
public class QuickSort {
8+
import java.util.Arrays;
99

10+
public class QuickSort {
11+
12+
private static int partition(int[] arr, int lo, int hi) {
13+
int pivot = lo; // pivot
14+
int i = lo; // 左边扫描指针(向右扫描)
15+
int j = hi + 1; // 右边扫描指针(向左扫描)
16+
17+
while (true) {
18+
// 左右扫描
19+
while (arr[pivot] > arr[++i]) if (i == hi) break;
20+
while (arr[pivot] < arr[--j]) if (j == lo) break;
21+
if (i >= j) break; // 当左右扫描指针相遇时主循环退出
22+
swap(arr, i, j);
23+
}
24+
swap(arr, pivot, j);
25+
return j;
26+
}
27+
28+
private static void swap(int[] arr, int i, int j) {
29+
int temp = arr[i];
30+
arr[i] = arr[j];
31+
arr[j] = temp;
32+
}
33+
34+
public static void sort(int[] arr, int lo, int hi) {
35+
if (lo >= hi) return;
36+
int pivot = partition(arr, lo, hi); // 切分
37+
sort(arr, lo, pivot - 1); // 将左半部分arr[lo .. j-1]排序
38+
sort(arr, pivot + 1, hi); // 将右半部分arr[j+1 .. hi]排序
39+
}
40+
41+
public static void main(String[] args) {
42+
int[] arr = {1, 4, 8, 2, 55, 3, 4, 8, 6, 4, 0, 11, 34, 90, 23, 54, 77, 9, 2, 9, 4, 10};
43+
sort(arr, 0, arr.length - 1);
44+
System.out.println(Arrays.toString(arr));
45+
}
1046
}

java/sort/ShellSort.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package sort;
2+
3+
import java.util.Arrays;
4+
5+
public class ShellSort {
6+
7+
public static void sort(int[] arr) {
8+
final int len = arr.length;
9+
int h = 0;
10+
while (h < len) {
11+
h = h * 3 + 1;
12+
}
13+
while (h >= 1) {
14+
// insertion sort
15+
for (int i = h; i < len; i += h) {
16+
for (int j = i; j > 0; j -= h) {
17+
if (arr[j] < arr[j - 1]) {
18+
int temp = arr[j];
19+
arr[j] = arr[j - 1];
20+
arr[j - 1] = temp;
21+
}
22+
}
23+
}
24+
h /= 3;
25+
}
26+
}
27+
28+
public static void main(String[] args) {
29+
int[] arr = { 2, 1, 5, 9, 4, 3 };
30+
sort(arr);
31+
System.out.println(Arrays.toString(arr));
32+
}
33+
34+
}

0 commit comments

Comments
 (0)