From df1224d30ae972b75dca9f3aa1ec14f15f171605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 10:37:39 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=92=E6=B3=A1?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/enums/StatusCode.java | 33 ++++++++++++ src/main/java/com/lin/sort/BubbleSort.java | 53 +++++++++++++++++++ .../java/com/lin/TestSort/BubbleSortTest.java | 20 +++++++ 3 files changed, 106 insertions(+) create mode 100644 src/main/java/com/lin/enums/StatusCode.java create mode 100644 src/main/java/com/lin/sort/BubbleSort.java create mode 100644 src/test/java/com/lin/TestSort/BubbleSortTest.java diff --git a/src/main/java/com/lin/enums/StatusCode.java b/src/main/java/com/lin/enums/StatusCode.java new file mode 100644 index 0000000..5fea2c4 --- /dev/null +++ b/src/main/java/com/lin/enums/StatusCode.java @@ -0,0 +1,33 @@ +package com.lin.enums; + +public enum StatusCode { + + + MIX_SORT(-1, "小到大"), + MAX_SORT(1, "大到小"); + + + int code; + String desc; + + StatusCode(int code, String desc) { + this.code = code; + this.desc = desc; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/src/main/java/com/lin/sort/BubbleSort.java b/src/main/java/com/lin/sort/BubbleSort.java new file mode 100644 index 0000000..ea131da --- /dev/null +++ b/src/main/java/com/lin/sort/BubbleSort.java @@ -0,0 +1,53 @@ +package com.lin.sort; + +import com.lin.enums.StatusCode; + +/** + * 冒泡排序 + */ +public class BubbleSort { + + + public static void bubbleSorted(int[] array, StatusCode statusCode) { + for (int i = 0; i < array.length; i++) { + for (int j = 0; j < array.length; j++) { + int falg = compare(array[i], array[j]); + //可修改排序方向 + if (falg == statusCode.getCode()) { + swap(array, i, j); + } + } + } + } + + /** + * 交换 + * + * @param array + * @param a + * @param b + */ + public static void swap(int[] array, int a, int b) { + int temp = array[a]; + array[a] = array[b]; + array[b] = temp; + } + + /** + * 比较器 + * + * @param a + * @param b + * @return + */ + public static int compare(int a, int b) { + if (a > b) { + return 1; + } else if (a < b) { + return -1; + } else { + return 0; + } + } + +} diff --git a/src/test/java/com/lin/TestSort/BubbleSortTest.java b/src/test/java/com/lin/TestSort/BubbleSortTest.java new file mode 100644 index 0000000..d20ecbb --- /dev/null +++ b/src/test/java/com/lin/TestSort/BubbleSortTest.java @@ -0,0 +1,20 @@ +package com.lin.TestSort; + +import com.lin.enums.StatusCode; +import com.lin.sort.BubbleSort; +import org.junit.Test; + +public class BubbleSortTest { + + + @Test + public void bubbleSortedTest(){ + int[] a = {1,6,8,2,4,5,7,1,0}; + BubbleSort.bubbleSorted(a, StatusCode.MAX_SORT); + for (int i : a) { + System.out.println(i); + } + + } + +} -- Gitee From 18804d4a10e1ad2c4037e389363c2ca0856f8ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 10:47:34 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/BubbleSort.java | 33 ++-------------- src/main/java/com/lin/sort/SelectionSort.java | 19 ++++++++++ src/main/java/com/lin/sort/util/SortUtil.java | 38 +++++++++++++++++++ 3 files changed, 60 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/lin/sort/SelectionSort.java create mode 100644 src/main/java/com/lin/sort/util/SortUtil.java diff --git a/src/main/java/com/lin/sort/BubbleSort.java b/src/main/java/com/lin/sort/BubbleSort.java index ea131da..8927176 100644 --- a/src/main/java/com/lin/sort/BubbleSort.java +++ b/src/main/java/com/lin/sort/BubbleSort.java @@ -1,6 +1,7 @@ package com.lin.sort; import com.lin.enums.StatusCode; +import com.lin.sort.util.SortUtil; /** * 冒泡排序 @@ -11,43 +12,15 @@ public class BubbleSort { public static void bubbleSorted(int[] array, StatusCode statusCode) { for (int i = 0; i < array.length; i++) { for (int j = 0; j < array.length; j++) { - int falg = compare(array[i], array[j]); + int falg = SortUtil.compare(array[i], array[j]); //可修改排序方向 if (falg == statusCode.getCode()) { - swap(array, i, j); + SortUtil.swap(array, i, j); } } } } - /** - * 交换 - * - * @param array - * @param a - * @param b - */ - public static void swap(int[] array, int a, int b) { - int temp = array[a]; - array[a] = array[b]; - array[b] = temp; - } - /** - * 比较器 - * - * @param a - * @param b - * @return - */ - public static int compare(int a, int b) { - if (a > b) { - return 1; - } else if (a < b) { - return -1; - } else { - return 0; - } - } } diff --git a/src/main/java/com/lin/sort/SelectionSort.java b/src/main/java/com/lin/sort/SelectionSort.java new file mode 100644 index 0000000..4cd73a8 --- /dev/null +++ b/src/main/java/com/lin/sort/SelectionSort.java @@ -0,0 +1,19 @@ +package com.lin.sort; + +import com.lin.enums.StatusCode; + +public class SelectionSort { + + + + + public static void selectionSorted(int[] array , StatusCode statusCode){ + + + + + } + + + +} diff --git a/src/main/java/com/lin/sort/util/SortUtil.java b/src/main/java/com/lin/sort/util/SortUtil.java new file mode 100644 index 0000000..331e81f --- /dev/null +++ b/src/main/java/com/lin/sort/util/SortUtil.java @@ -0,0 +1,38 @@ +package com.lin.sort.util; + +/** + * 排序工具 + */ +public class SortUtil { + + /** + * 交换 + * + * @param array + * @param a + * @param b + */ + public static void swap(int[] array, int a, int b) { + int temp = array[a]; + array[a] = array[b]; + array[b] = temp; + } + + /** + * 比较器 + * + * @param a + * @param b + * @return + */ + public static int compare(int a, int b) { + if (a > b) { + return 1; + } else if (a < b) { + return -1; + } else { + return 0; + } + } + +} -- Gitee From b1865bffbb41ede649fe1de93251c82c635ff95f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 10:58:42 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/SelectionSort.java | 22 ++++++++++++++----- .../com/lin/TestSort/SelectionSortTest.java | 18 +++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/lin/TestSort/SelectionSortTest.java diff --git a/src/main/java/com/lin/sort/SelectionSort.java b/src/main/java/com/lin/sort/SelectionSort.java index 4cd73a8..39d6b86 100644 --- a/src/main/java/com/lin/sort/SelectionSort.java +++ b/src/main/java/com/lin/sort/SelectionSort.java @@ -1,19 +1,31 @@ package com.lin.sort; import com.lin.enums.StatusCode; +import com.lin.sort.util.SortUtil; public class SelectionSort { + public static void selectionSorted(int[] array, StatusCode statusCode) { + //确定最小的位置 + for (int i = 0; i < array.length; i++) { + int min = i; + //确定最小的位置存放的数据 + for (int j = i + 1; j < array.length; j++) { + //用标志为查出为排序队列中最小/大的 + if (statusCode.getCode() == SortUtil.compare(array[j], array[min])) { + min = j; + } + } + //将最小的放在最前面 + if (min != i) { + SortUtil.swap(array, i, min); + } - - public static void selectionSorted(int[] array , StatusCode statusCode){ - - + } } - } diff --git a/src/test/java/com/lin/TestSort/SelectionSortTest.java b/src/test/java/com/lin/TestSort/SelectionSortTest.java new file mode 100644 index 0000000..a53ff6f --- /dev/null +++ b/src/test/java/com/lin/TestSort/SelectionSortTest.java @@ -0,0 +1,18 @@ +package com.lin.TestSort; + +import com.lin.enums.StatusCode; +import com.lin.sort.SelectionSort; +import org.junit.Test; + +public class SelectionSortTest { + + + @Test + public void selectionSortedTest() { + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + SelectionSort.selectionSorted(a,StatusCode.MIX_SORT); + for (int i : a) { + System.out.println(i); + } + } +} -- Gitee From 41e3f5d1234760b02796f2f4f59f1eedd05044ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 11:27:10 +0800 Subject: [PATCH 04/17] =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E6=8F=92=E5=85=A5?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/InsertionSort.java | 26 +++++++++++++++++++ .../com/lin/TestSort/InsertionSortTest.java | 18 +++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/java/com/lin/sort/InsertionSort.java create mode 100644 src/test/java/com/lin/TestSort/InsertionSortTest.java diff --git a/src/main/java/com/lin/sort/InsertionSort.java b/src/main/java/com/lin/sort/InsertionSort.java new file mode 100644 index 0000000..d80426a --- /dev/null +++ b/src/main/java/com/lin/sort/InsertionSort.java @@ -0,0 +1,26 @@ +package com.lin.sort; + +import com.lin.enums.StatusCode; +import com.lin.sort.util.SortUtil; + +public class InsertionSort { + + + public static void insertionSorted(int[] array, StatusCode statusCode) { + //默认第0个是排好序的,i以前的排好序 + for (int i = 1; i < array.length; i++) { + int get = array[i]; + int j = i - 1; + //从当前位值倒序往前查找 + while (j >= 0 && statusCode.getCode() == SortUtil.compare(get, array[j])) { + array[j + 1] = array[j]; + j--; + } + //不满足比较条件时放在位置的右边 + array[j + 1] = get; + } + + } + + +} diff --git a/src/test/java/com/lin/TestSort/InsertionSortTest.java b/src/test/java/com/lin/TestSort/InsertionSortTest.java new file mode 100644 index 0000000..119081b --- /dev/null +++ b/src/test/java/com/lin/TestSort/InsertionSortTest.java @@ -0,0 +1,18 @@ +package com.lin.TestSort; + +import com.lin.enums.StatusCode; +import com.lin.sort.InsertionSort; +import org.junit.Test; + +public class InsertionSortTest { + + + @Test + public void insertionSortedtest() { + int[] a = {1,6,8,2,4,5,7,1,0}; + InsertionSort.insertionSorted(a, StatusCode.MIX_SORT); + for (int i : a) { + System.out.println(i); + } + } +} -- Gitee From d2d37bc0f4c76babb7c9d911e1b7666cf12496c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 13:56:48 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E5=B8=8C=E5=B0=94=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/ShellSort.java | 33 +++++++++++++++++++ .../java/com/lin/TestSort/ShellSortTest.java | 21 ++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/main/java/com/lin/sort/ShellSort.java create mode 100644 src/test/java/com/lin/TestSort/ShellSortTest.java diff --git a/src/main/java/com/lin/sort/ShellSort.java b/src/main/java/com/lin/sort/ShellSort.java new file mode 100644 index 0000000..0306c19 --- /dev/null +++ b/src/main/java/com/lin/sort/ShellSort.java @@ -0,0 +1,33 @@ +package com.lin.sort; + +import com.lin.enums.StatusCode; +import com.lin.sort.util.SortUtil; + +public class ShellSort { + + + public static void shellSorted(int[] array, StatusCode statusCode) { + int shell = 0; + //寻找最大的希尔值 + while (shell <= array.length) { + shell = shell * 3 + 1; + } + //通过希尔来降低排序复杂度 + while (shell >= 1) { + //确定希尔值后,内部使用呢直接插入排序 + for (int i = shell; i < array.length; i++) { + int j = i - shell; + int get = array[i]; + while (j >= 0 && statusCode.getCode() == SortUtil.compare(get, array[j])) { + array[j + shell] = array[j]; + j = j - shell; + } + array[j + shell] = get; + } + shell = (shell - 1) / 3; + } + + + } + +} diff --git a/src/test/java/com/lin/TestSort/ShellSortTest.java b/src/test/java/com/lin/TestSort/ShellSortTest.java new file mode 100644 index 0000000..f138176 --- /dev/null +++ b/src/test/java/com/lin/TestSort/ShellSortTest.java @@ -0,0 +1,21 @@ +package com.lin.TestSort; + +import com.lin.enums.StatusCode; +import com.lin.sort.ShellSort; +import org.junit.Test; + +public class ShellSortTest { + + @Test + public void shellSortTest(){ + int[] a = {1,6,8,2,4,5,7,1,0}; + ShellSort.shellSorted(a,StatusCode.MIX_SORT); + for (int i : a) { + System.out.println(i); + } + } + + + + +} -- Gitee From 1685666e8dc314ef5045b4a11e7d6a8140a07643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 15:38:54 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E9=80=92=E5=BD=92=E5=B8=8C=E5=B0=94?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/MergeSort.java | 81 +++++++++++++++++++ .../java/com/lin/TestSort/MergeSortTest.java | 28 +++++++ 2 files changed, 109 insertions(+) create mode 100644 src/main/java/com/lin/sort/MergeSort.java create mode 100644 src/test/java/com/lin/TestSort/MergeSortTest.java diff --git a/src/main/java/com/lin/sort/MergeSort.java b/src/main/java/com/lin/sort/MergeSort.java new file mode 100644 index 0000000..20c83d2 --- /dev/null +++ b/src/main/java/com/lin/sort/MergeSort.java @@ -0,0 +1,81 @@ +package com.lin.sort; + +import com.lin.enums.StatusCode; +import com.lin.sort.util.SortUtil; + +public class MergeSort { + + + /** + * 非递归归并排序(错误) + * + * @param array + * @param statusCode + */ + public static void mergeSortedIteration(int array[], StatusCode statusCode) { + int left, mid, right; + for (int i = 1; i < array.length; i *= 2) { + left = 0; + while (left + i < array.length) { + mid = left + i - 1; + right = mid + 1 < array.length ? mid + 1 : array.length - 1; + merge(array, statusCode, left, mid, right); + left = mid + 1; + } + } + } + + + /** + * 递归使用归并排序 + * + * @param array + * @param statusCode + * @param left + * @param right + */ + public static void mergeSortedRecursion(int[] array, StatusCode statusCode, int left, int right) { + if (left == right) + return; + int mid = (left + right) / 2; + mergeSortedRecursion(array, statusCode, left, mid); + mergeSortedRecursion(array, statusCode, mid + 1, right); + merge(array, statusCode, left, mid, right); + } + + /** + * 数组合并 + * + * @param array + * @param statusCode + * @param left + * @param mid + * @param right + */ + private static void merge(int[] array, StatusCode statusCode, int left, int mid, int right) { + int len = right - left + 1; + int[] temp = new int[len]; + int index = 0; + //前半段数组起始 + int i = left; + //后半段数组起始 + int j = mid + 1; + //两组数据归并操作 + while (i <= mid && j <= right) { + temp[index++] = statusCode.getCode() == SortUtil.compare(array[i], array[j]) ? array[i++] : array[j++]; + } + //上面的循环无法将两个子数组的数据全部循环到 + while (i <= mid) { + temp[index++] = array[i++]; + } + while (j <= right) { + temp[index++] = array[j++]; + } + //数据放入原 + int tindex = 0; + while (tindex < temp.length) { + array[left++] = temp[tindex++]; + } + + } +} diff --git a/src/test/java/com/lin/TestSort/MergeSortTest.java b/src/test/java/com/lin/TestSort/MergeSortTest.java new file mode 100644 index 0000000..180110c --- /dev/null +++ b/src/test/java/com/lin/TestSort/MergeSortTest.java @@ -0,0 +1,28 @@ +package com.lin.TestSort; + +import com.lin.enums.StatusCode; +import com.lin.sort.MergeSort; +import org.junit.Test; + +public class MergeSortTest { + + + @Test + public void mergeSortedRecursionTest() { + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + MergeSort.mergeSortedRecursion(a, StatusCode.MAX_SORT, 0, a.length-1); + for (int i : a) { + System.out.println(i); + } + } + + @Test + public void mergeSortedIterationTest(){ + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + MergeSort.mergeSortedIteration(a, StatusCode.MIX_SORT); + for (int i : a) { + System.out.println(i); + } + } + +} -- Gitee From af6401df5ec0a42778c2f6a97f187b54bfdbd42b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 15:39:57 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E9=80=92=E5=BD=92=E5=B8=8C=E5=B0=94?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/MergeSort.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/lin/sort/MergeSort.java b/src/main/java/com/lin/sort/MergeSort.java index 20c83d2..70afaee 100644 --- a/src/main/java/com/lin/sort/MergeSort.java +++ b/src/main/java/com/lin/sort/MergeSort.java @@ -38,8 +38,11 @@ public class MergeSort { if (left == right) return; int mid = (left + right) / 2; + //前半段数组归并 mergeSortedRecursion(array, statusCode, left, mid); + //后半段数组归并 mergeSortedRecursion(array, statusCode, mid + 1, right); + //归并合并 merge(array, statusCode, left, mid, right); } -- Gitee From d6128599f1f96c0b5c0f49b3fc4de546d5a9d3c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 16:33:10 +0800 Subject: [PATCH 08/17] =?UTF-8?q?=E5=A0=86=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/HeapSort.java | 65 +++++++++++++++++++ .../java/com/lin/TestSort/HeapSortTest.java | 19 ++++++ 2 files changed, 84 insertions(+) create mode 100644 src/main/java/com/lin/sort/HeapSort.java create mode 100644 src/test/java/com/lin/TestSort/HeapSortTest.java diff --git a/src/main/java/com/lin/sort/HeapSort.java b/src/main/java/com/lin/sort/HeapSort.java new file mode 100644 index 0000000..e1b47fa --- /dev/null +++ b/src/main/java/com/lin/sort/HeapSort.java @@ -0,0 +1,65 @@ +package com.lin.sort; + +import com.lin.enums.StatusCode; +import com.lin.sort.util.SortUtil; + +public class HeapSort { + + /** + * 堆排序 + * + * @param array + * @param statusCode + */ + public static void heapSorted(int[] array, StatusCode statusCode) { + int heap_size = buildHeap(array, array.length, statusCode); // 建立一个最大堆 + while (heap_size > 1) { // 堆(无序区)元素个数大于1,未完成排序 + // 将堆顶元素与堆的最后一个元素互换,并从堆中去掉最后一个元素 + // 此处交换操作很有可能把后面元素的稳定性打乱,所以堆排序是不稳定的排序算法 + SortUtil.swap(array, 0, --heap_size); + heapify(array, 0, heap_size, statusCode); // 从新的堆顶元素开始向下进行堆调整,时间复杂度O(logn) + } + } + + + /** + * 堆结构调整 + * + * @param array + * @param i + * @param size + */ + private static void heapify(int[] array, int i, int size, StatusCode statusCode) // 从A[i]向下进行堆调整 + { + int left_child = 2 * i + 1; // 左孩子索引 + int right_child = 2 * i + 2; // 右孩子索引 + int max = i; // 选出当前结点与其左右孩子三者之中的最大值 + if (left_child < size && statusCode.getCode() == SortUtil.compare(array[max], array[left_child])) +// if (left_child < size && array[left_child] > array[max]) + max = left_child; + if (right_child < size && statusCode.getCode() == SortUtil.compare(array[max], array[right_child])) +// if (right_child < size && array[right_child] > array[max]) + max = right_child; + if (max != i) { + SortUtil.swap(array, i, max); // 把当前结点和它的最大(直接)子节点进行交换 + heapify(array, max, size, statusCode); // 递归调用,继续从当前结点向下进行堆调整 + } + } + + /** + * 构造堆 + * + * @param array + * @param n + * @return + */ + private static int buildHeap(int[] array, int n, StatusCode statusCode) // 建堆,时间复杂度O(n) + { + int heap_size = n; + for (int i = heap_size / 2 - 1; i >= 0; i--) // 从每一个非叶结点开始向下进行堆调整 + heapify(array, i, heap_size, statusCode); + return heap_size; + } + + +} diff --git a/src/test/java/com/lin/TestSort/HeapSortTest.java b/src/test/java/com/lin/TestSort/HeapSortTest.java new file mode 100644 index 0000000..8a57c96 --- /dev/null +++ b/src/test/java/com/lin/TestSort/HeapSortTest.java @@ -0,0 +1,19 @@ +package com.lin.TestSort; + +import com.lin.enums.StatusCode; +import com.lin.sort.HeapSort; +import org.junit.Test; + +public class HeapSortTest { + + + @Test + public void heapSrotTest() { + int[] a = {1,6,8,2,4,5,7,1,0}; + HeapSort.heapSorted(a,StatusCode.MAX_SORT); + for (int i : a) { + System.out.println(i); + } + } + +} -- Gitee From 273a7806e095933a74946fe6def5ccd3cc54688c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 17:51:37 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E5=BF=AB=E9=80=9F=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/QuickSort.java | 35 +++++++++++++++++++ .../com/lin/TestSort/QuickSortedTest.java | 19 ++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/main/java/com/lin/sort/QuickSort.java create mode 100644 src/test/java/com/lin/TestSort/QuickSortedTest.java diff --git a/src/main/java/com/lin/sort/QuickSort.java b/src/main/java/com/lin/sort/QuickSort.java new file mode 100644 index 0000000..bb96319 --- /dev/null +++ b/src/main/java/com/lin/sort/QuickSort.java @@ -0,0 +1,35 @@ +package com.lin.sort; + +import com.lin.enums.StatusCode; +import com.lin.sort.util.SortUtil; + +public class QuickSort { + + + private static int partition(int[] array, int left, int right, StatusCode statusCode) // 划分函数 + { + int pivot = array[right]; // 这里每次都选择最后一个元素作为基准 + int tail = left - 1; // tail为小于基准的子数组最后一个元素的索引 + for (int i = left; i < right; i++) // 遍历基准以外的其他元素 + { + if (SortUtil.compare(pivot, array[i]) == 0 || !(statusCode.getCode() == SortUtil.compare(pivot, array[i]))) //会破环稳定性 +// if (array[i] <= pivot) // 把小于等于基准的元素放到前一个子数组末尾 + { + SortUtil.swap(array, ++tail, i); + } + } + SortUtil.swap(array, tail + 1, right); // 最后把基准放到前一个子数组的后边,剩下的子数组既是大于基准的子数组 + // 该操作很有可能把后面元素的稳定性打乱,所以快速排序是不稳定的排序算法 + return tail + 1; // 返回基准的索引 + } + + public static void quickSorted(int[] array, int left, int right, StatusCode statusCode) { + if (left >= right) + return; + int pivot_index = partition(array, left, right, statusCode); // 基准的索引 + quickSorted(array, left, pivot_index - 1, statusCode); + quickSorted(array, pivot_index + 1, right, statusCode); + } + + +} diff --git a/src/test/java/com/lin/TestSort/QuickSortedTest.java b/src/test/java/com/lin/TestSort/QuickSortedTest.java new file mode 100644 index 0000000..a163556 --- /dev/null +++ b/src/test/java/com/lin/TestSort/QuickSortedTest.java @@ -0,0 +1,19 @@ +package com.lin.TestSort; + +import com.lin.enums.StatusCode; +import com.lin.sort.QuickSort; +import org.junit.Test; + +public class QuickSortedTest { + + + @Test + public void quickSortedTest() { + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + QuickSort.quickSorted(a, 0, a.length - 1,StatusCode.MAX_SORT); + for (int i : a) { + System.out.println(i); + } + } + +} -- Gitee From 8496be9a370786c45ce7be761aa65eeb58f9bfe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Mon, 9 Mar 2020 21:37:03 +0800 Subject: [PATCH 10/17] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/HeapSort.java | 3 +++ src/main/java/com/lin/sort/InsertionSort.java | 3 +++ src/main/java/com/lin/sort/MergeSort.java | 3 +++ src/main/java/com/lin/sort/QuickSort.java | 3 +++ src/main/java/com/lin/sort/SelectionSort.java | 3 +++ src/main/java/com/lin/sort/ShellSort.java | 3 +++ 6 files changed, 18 insertions(+) diff --git a/src/main/java/com/lin/sort/HeapSort.java b/src/main/java/com/lin/sort/HeapSort.java index e1b47fa..c642739 100644 --- a/src/main/java/com/lin/sort/HeapSort.java +++ b/src/main/java/com/lin/sort/HeapSort.java @@ -3,6 +3,9 @@ package com.lin.sort; import com.lin.enums.StatusCode; import com.lin.sort.util.SortUtil; +/** + * 堆排序 + */ public class HeapSort { /** diff --git a/src/main/java/com/lin/sort/InsertionSort.java b/src/main/java/com/lin/sort/InsertionSort.java index d80426a..f722d2f 100644 --- a/src/main/java/com/lin/sort/InsertionSort.java +++ b/src/main/java/com/lin/sort/InsertionSort.java @@ -3,6 +3,9 @@ package com.lin.sort; import com.lin.enums.StatusCode; import com.lin.sort.util.SortUtil; +/** + * 插入排序 + */ public class InsertionSort { diff --git a/src/main/java/com/lin/sort/MergeSort.java b/src/main/java/com/lin/sort/MergeSort.java index 70afaee..4360e68 100644 --- a/src/main/java/com/lin/sort/MergeSort.java +++ b/src/main/java/com/lin/sort/MergeSort.java @@ -3,6 +3,9 @@ package com.lin.sort; import com.lin.enums.StatusCode; import com.lin.sort.util.SortUtil; +/** + * 归并排序 + */ public class MergeSort { diff --git a/src/main/java/com/lin/sort/QuickSort.java b/src/main/java/com/lin/sort/QuickSort.java index bb96319..4a73982 100644 --- a/src/main/java/com/lin/sort/QuickSort.java +++ b/src/main/java/com/lin/sort/QuickSort.java @@ -3,6 +3,9 @@ package com.lin.sort; import com.lin.enums.StatusCode; import com.lin.sort.util.SortUtil; +/** + * 快速排序 + */ public class QuickSort { diff --git a/src/main/java/com/lin/sort/SelectionSort.java b/src/main/java/com/lin/sort/SelectionSort.java index 39d6b86..f139da2 100644 --- a/src/main/java/com/lin/sort/SelectionSort.java +++ b/src/main/java/com/lin/sort/SelectionSort.java @@ -3,6 +3,9 @@ package com.lin.sort; import com.lin.enums.StatusCode; import com.lin.sort.util.SortUtil; +/** + * 选择排序 + */ public class SelectionSort { diff --git a/src/main/java/com/lin/sort/ShellSort.java b/src/main/java/com/lin/sort/ShellSort.java index 0306c19..9453abc 100644 --- a/src/main/java/com/lin/sort/ShellSort.java +++ b/src/main/java/com/lin/sort/ShellSort.java @@ -3,6 +3,9 @@ package com.lin.sort; import com.lin.enums.StatusCode; import com.lin.sort.util.SortUtil; +/** + * 希尔排序 + */ public class ShellSort { -- Gitee From 5231ca87c96215782e97d7a32308f045926e640f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Tue, 10 Mar 2020 10:04:14 +0800 Subject: [PATCH 11/17] =?UTF-8?q?=E4=BA=8C=E5=88=86=E6=8F=92=E5=85=A5?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/BubbleSort.java | 7 +++- src/main/java/com/lin/sort/InsertionSort.java | 35 +++++++++++++++++++ src/main/java/com/lin/sort/QuickSort.java | 12 +++++++ src/main/java/com/lin/sort/SelectionSort.java | 6 ++++ src/main/java/com/lin/sort/ShellSort.java | 6 ++++ .../com/lin/TestSort/InsertionSortTest.java | 11 ++++++ 6 files changed, 76 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/lin/sort/BubbleSort.java b/src/main/java/com/lin/sort/BubbleSort.java index 8927176..7e17c14 100644 --- a/src/main/java/com/lin/sort/BubbleSort.java +++ b/src/main/java/com/lin/sort/BubbleSort.java @@ -9,6 +9,12 @@ import com.lin.sort.util.SortUtil; public class BubbleSort { + /** + * 冒泡排序 + * + * @param array + * @param statusCode + */ public static void bubbleSorted(int[] array, StatusCode statusCode) { for (int i = 0; i < array.length; i++) { for (int j = 0; j < array.length; j++) { @@ -22,5 +28,4 @@ public class BubbleSort { } - } diff --git a/src/main/java/com/lin/sort/InsertionSort.java b/src/main/java/com/lin/sort/InsertionSort.java index f722d2f..33bf8f2 100644 --- a/src/main/java/com/lin/sort/InsertionSort.java +++ b/src/main/java/com/lin/sort/InsertionSort.java @@ -9,6 +9,12 @@ import com.lin.sort.util.SortUtil; public class InsertionSort { + /** + * 插入排序 + * + * @param array + * @param statusCode + */ public static void insertionSorted(int[] array, StatusCode statusCode) { //默认第0个是排好序的,i以前的排好序 for (int i = 1; i < array.length; i++) { @@ -25,5 +31,34 @@ public class InsertionSort { } + /** + * 二分插入排序 + * + * @param array + * @param statusCode + */ + public static void insertionSortedDichotomy(int[] array, StatusCode statusCode) { + for (int i = 1; i < array.length; i++) { + int get = array[i]; + int left = 0; + int right = i - 1; + //二分查找数据所处的位置,也是在之前的队列中 + while (left <= right) + { + int mid = (left + right) / 2; + if (statusCode.getCode() == SortUtil.compare(get,array[mid])) +// if (array[mid] > get) + right = mid - 1; + else + left = mid + 1; + } + //拿走的是位置i的数据,left之后的往后移动 + for (int j = i - 1; j >= left; j--) + { + array[j + 1] = array[j]; + } + array[left] = get; + } + } } diff --git a/src/main/java/com/lin/sort/QuickSort.java b/src/main/java/com/lin/sort/QuickSort.java index 4a73982..9ad9d23 100644 --- a/src/main/java/com/lin/sort/QuickSort.java +++ b/src/main/java/com/lin/sort/QuickSort.java @@ -9,6 +9,15 @@ import com.lin.sort.util.SortUtil; public class QuickSort { + /** + * 分治块 + * + * @param array + * @param left + * @param right + * @param statusCode + * @return + */ private static int partition(int[] array, int left, int right, StatusCode statusCode) // 划分函数 { int pivot = array[right]; // 这里每次都选择最后一个元素作为基准 @@ -26,6 +35,9 @@ public class QuickSort { return tail + 1; // 返回基准的索引 } + /** + * 快速排序 + */ public static void quickSorted(int[] array, int left, int right, StatusCode statusCode) { if (left >= right) return; diff --git a/src/main/java/com/lin/sort/SelectionSort.java b/src/main/java/com/lin/sort/SelectionSort.java index f139da2..bd55362 100644 --- a/src/main/java/com/lin/sort/SelectionSort.java +++ b/src/main/java/com/lin/sort/SelectionSort.java @@ -9,6 +9,12 @@ import com.lin.sort.util.SortUtil; public class SelectionSort { + /** + * 选择排序 + * + * @param array + * @param statusCode + */ public static void selectionSorted(int[] array, StatusCode statusCode) { //确定最小的位置 for (int i = 0; i < array.length; i++) { diff --git a/src/main/java/com/lin/sort/ShellSort.java b/src/main/java/com/lin/sort/ShellSort.java index 9453abc..7043626 100644 --- a/src/main/java/com/lin/sort/ShellSort.java +++ b/src/main/java/com/lin/sort/ShellSort.java @@ -9,6 +9,12 @@ import com.lin.sort.util.SortUtil; public class ShellSort { + /** + * 希尔排序 + * + * @param array + * @param statusCode + */ public static void shellSorted(int[] array, StatusCode statusCode) { int shell = 0; //寻找最大的希尔值 diff --git a/src/test/java/com/lin/TestSort/InsertionSortTest.java b/src/test/java/com/lin/TestSort/InsertionSortTest.java index 119081b..543c400 100644 --- a/src/test/java/com/lin/TestSort/InsertionSortTest.java +++ b/src/test/java/com/lin/TestSort/InsertionSortTest.java @@ -15,4 +15,15 @@ public class InsertionSortTest { System.out.println(i); } } + + @Test + public void insertionSortedDichotomyTest() { + int[] a = {1,6,8,2,4,5,7,1,0}; + InsertionSort.insertionSortedDichotomy(a, StatusCode.MIX_SORT); + for (int i : a) { + System.out.println(i); + } + } + + } -- Gitee From b041d500b38d9303a203ef5edc64c9a277c53f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Tue, 10 Mar 2020 10:19:45 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/enums/StatusCode.java | 3 ++- src/main/java/com/lin/sort/BubbleSort.java | 1 + src/main/java/com/lin/sort/HeapSort.java | 1 + src/main/java/com/lin/sort/InsertionSort.java | 1 + src/main/java/com/lin/sort/MergeSort.java | 1 + src/main/java/com/lin/sort/QuickSort.java | 1 + src/main/java/com/lin/sort/SelectionSort.java | 1 + 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/lin/enums/StatusCode.java b/src/main/java/com/lin/enums/StatusCode.java index 5fea2c4..dadd128 100644 --- a/src/main/java/com/lin/enums/StatusCode.java +++ b/src/main/java/com/lin/enums/StatusCode.java @@ -4,7 +4,8 @@ public enum StatusCode { MIX_SORT(-1, "小到大"), - MAX_SORT(1, "大到小"); + MAX_SORT(1, "大到小"), + EQUAL(0, "相等"); int code; diff --git a/src/main/java/com/lin/sort/BubbleSort.java b/src/main/java/com/lin/sort/BubbleSort.java index 7e17c14..b7063bd 100644 --- a/src/main/java/com/lin/sort/BubbleSort.java +++ b/src/main/java/com/lin/sort/BubbleSort.java @@ -5,6 +5,7 @@ import com.lin.sort.util.SortUtil; /** * 冒泡排序 + *
O(n)~O(n^2)~O(n^2)
*/ public class BubbleSort { diff --git a/src/main/java/com/lin/sort/HeapSort.java b/src/main/java/com/lin/sort/HeapSort.java index c642739..0c498da 100644 --- a/src/main/java/com/lin/sort/HeapSort.java +++ b/src/main/java/com/lin/sort/HeapSort.java @@ -5,6 +5,7 @@ import com.lin.sort.util.SortUtil; /** * 堆排序 + *O(nlogn)~O(nlogn)~O(nlogn)
*/ public class HeapSort { diff --git a/src/main/java/com/lin/sort/InsertionSort.java b/src/main/java/com/lin/sort/InsertionSort.java index 33bf8f2..21b660c 100644 --- a/src/main/java/com/lin/sort/InsertionSort.java +++ b/src/main/java/com/lin/sort/InsertionSort.java @@ -5,6 +5,7 @@ import com.lin.sort.util.SortUtil; /** * 插入排序 + *O(n)~O(n^2)~O(n^2)
*/ public class InsertionSort { diff --git a/src/main/java/com/lin/sort/MergeSort.java b/src/main/java/com/lin/sort/MergeSort.java index 4360e68..1105f45 100644 --- a/src/main/java/com/lin/sort/MergeSort.java +++ b/src/main/java/com/lin/sort/MergeSort.java @@ -5,6 +5,7 @@ import com.lin.sort.util.SortUtil; /** * 归并排序 + *O(nlogn)~O(nlogn)~O(nlogn)
*/ public class MergeSort { diff --git a/src/main/java/com/lin/sort/QuickSort.java b/src/main/java/com/lin/sort/QuickSort.java index 9ad9d23..e0e3376 100644 --- a/src/main/java/com/lin/sort/QuickSort.java +++ b/src/main/java/com/lin/sort/QuickSort.java @@ -5,6 +5,7 @@ import com.lin.sort.util.SortUtil; /** * 快速排序 + *O(nlogn)~O(nlogn)~O(n^2)
*/ public class QuickSort { diff --git a/src/main/java/com/lin/sort/SelectionSort.java b/src/main/java/com/lin/sort/SelectionSort.java index bd55362..5f56fdd 100644 --- a/src/main/java/com/lin/sort/SelectionSort.java +++ b/src/main/java/com/lin/sort/SelectionSort.java @@ -5,6 +5,7 @@ import com.lin.sort.util.SortUtil; /** * 选择排序 + *O(n^1.3)~O(nlogn)~O(n^2)~O(n^2)
*/ public class SelectionSort { -- Gitee From e558af89eb62025b682f09fe4a7ee89f913e45f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Tue, 10 Mar 2020 10:25:21 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=A4=8D=E6=9D=82=E5=BA=A6=EF=BC=8C=E7=A8=B3=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/BubbleSort.java | 1 + src/main/java/com/lin/sort/HeapSort.java | 1 + src/main/java/com/lin/sort/InsertionSort.java | 1 + src/main/java/com/lin/sort/MergeSort.java | 1 + src/main/java/com/lin/sort/QuickSort.java | 1 + src/main/java/com/lin/sort/SelectionSort.java | 3 ++- src/main/java/com/lin/sort/ShellSort.java | 2 ++ 7 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/lin/sort/BubbleSort.java b/src/main/java/com/lin/sort/BubbleSort.java index b7063bd..3de43c3 100644 --- a/src/main/java/com/lin/sort/BubbleSort.java +++ b/src/main/java/com/lin/sort/BubbleSort.java @@ -6,6 +6,7 @@ import com.lin.sort.util.SortUtil; /** * 冒泡排序 *O(n)~O(n^2)~O(n^2)
+ * 稳定 */ public class BubbleSort { diff --git a/src/main/java/com/lin/sort/HeapSort.java b/src/main/java/com/lin/sort/HeapSort.java index 0c498da..6ab5f7f 100644 --- a/src/main/java/com/lin/sort/HeapSort.java +++ b/src/main/java/com/lin/sort/HeapSort.java @@ -6,6 +6,7 @@ import com.lin.sort.util.SortUtil; /** * 堆排序 *O(nlogn)~O(nlogn)~O(nlogn)
+ * 不稳定 */ public class HeapSort { diff --git a/src/main/java/com/lin/sort/InsertionSort.java b/src/main/java/com/lin/sort/InsertionSort.java index 21b660c..f19c696 100644 --- a/src/main/java/com/lin/sort/InsertionSort.java +++ b/src/main/java/com/lin/sort/InsertionSort.java @@ -6,6 +6,7 @@ import com.lin.sort.util.SortUtil; /** * 插入排序 *O(n)~O(n^2)~O(n^2)
+ * 稳定 */ public class InsertionSort { diff --git a/src/main/java/com/lin/sort/MergeSort.java b/src/main/java/com/lin/sort/MergeSort.java index 1105f45..5df23b9 100644 --- a/src/main/java/com/lin/sort/MergeSort.java +++ b/src/main/java/com/lin/sort/MergeSort.java @@ -6,6 +6,7 @@ import com.lin.sort.util.SortUtil; /** * 归并排序 *O(nlogn)~O(nlogn)~O(nlogn)
+ * 稳定 */ public class MergeSort { diff --git a/src/main/java/com/lin/sort/QuickSort.java b/src/main/java/com/lin/sort/QuickSort.java index e0e3376..f4f76c4 100644 --- a/src/main/java/com/lin/sort/QuickSort.java +++ b/src/main/java/com/lin/sort/QuickSort.java @@ -6,6 +6,7 @@ import com.lin.sort.util.SortUtil; /** * 快速排序 *O(nlogn)~O(nlogn)~O(n^2)
+ * 不稳定 */ public class QuickSort { diff --git a/src/main/java/com/lin/sort/SelectionSort.java b/src/main/java/com/lin/sort/SelectionSort.java index 5f56fdd..3b6e7d3 100644 --- a/src/main/java/com/lin/sort/SelectionSort.java +++ b/src/main/java/com/lin/sort/SelectionSort.java @@ -5,7 +5,8 @@ import com.lin.sort.util.SortUtil; /** * 选择排序 - *O(n^1.3)~O(nlogn)~O(n^2)~O(n^2)
+ *O(n^2)~O(n^2)~O(n^2)
+ * 不稳定 */ public class SelectionSort { diff --git a/src/main/java/com/lin/sort/ShellSort.java b/src/main/java/com/lin/sort/ShellSort.java index 7043626..9bc7739 100644 --- a/src/main/java/com/lin/sort/ShellSort.java +++ b/src/main/java/com/lin/sort/ShellSort.java @@ -5,6 +5,8 @@ import com.lin.sort.util.SortUtil; /** * 希尔排序 + *O(n^1.3)~O(nlogn)~O(n^2)~O(n^2)
+ * 不稳定 */ public class ShellSort { -- Gitee From 73aae2a2cfed8d4f2591750de030dd2c9be55425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Tue, 10 Mar 2020 11:15:03 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=B8=A1=E5=B0=BE?= =?UTF-8?q?=E9=85=92=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/BubbleSort.java | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/com/lin/sort/BubbleSort.java b/src/main/java/com/lin/sort/BubbleSort.java index 3de43c3..2bbfa36 100644 --- a/src/main/java/com/lin/sort/BubbleSort.java +++ b/src/main/java/com/lin/sort/BubbleSort.java @@ -30,4 +30,32 @@ public class BubbleSort { } + /** + * 鸡尾酒排序 + * + * @param array + * @param n + */ + public static void CocktailSort(int[] array, int n) { + int left = 0; // 初始化边界 + int right = n - 1; + while (left < right) { + for (int i = left; i < right; i++) // 前半轮,将最大元素放到后面 + { + if (array[i] > array[i + 1]) { + SortUtil.swap(array, i, i + 1); + } + } + right--; + for (int i = right; i > left; i--) // 后半轮,将最小元素放到前面 + { + if (array[i - 1] > array[i]) { + SortUtil.swap(array, i - 1, i); + } + } + left++; + } + } + + } -- Gitee From 45cab725bfbd8191890722b0f6bc0f33eb438039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Tue, 10 Mar 2020 14:52:41 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E8=AE=A1=E6=95=B0=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=EF=BC=8C=E5=9F=BA=E6=95=B0=E6=8E=92=E5=BA=8F=EF=BC=8C=E6=A1=B6?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/sort/BucketSort.java | 86 ++++++++++++++ src/main/java/com/lin/sort/CountingSort.java | 66 +++++++++++ src/main/java/com/lin/sort/RadixSort.java | 107 ++++++++++++++++++ .../java/com/lin/TestSort/BubbleSortTest.java | 2 +- .../java/com/lin/TestSort/BucketSortTest.java | 17 +++ .../com/lin/TestSort/CountingSortTest.java | 17 +++ .../java/com/lin/TestSort/HeapSortTest.java | 4 +- .../com/lin/TestSort/InsertionSortTest.java | 4 +- .../java/com/lin/TestSort/MergeSortTest.java | 4 +- .../com/lin/TestSort/QuickSortedTest.java | 2 +- .../java/com/lin/TestSort/RadixSortTest.java | 20 ++++ .../com/lin/TestSort/SelectionSortTest.java | 2 +- .../java/com/lin/TestSort/ShellSortTest.java | 8 +- 13 files changed, 325 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/lin/sort/BucketSort.java create mode 100644 src/main/java/com/lin/sort/CountingSort.java create mode 100644 src/main/java/com/lin/sort/RadixSort.java create mode 100644 src/test/java/com/lin/TestSort/BucketSortTest.java create mode 100644 src/test/java/com/lin/TestSort/CountingSortTest.java create mode 100644 src/test/java/com/lin/TestSort/RadixSortTest.java diff --git a/src/main/java/com/lin/sort/BucketSort.java b/src/main/java/com/lin/sort/BucketSort.java new file mode 100644 index 0000000..9dab05f --- /dev/null +++ b/src/main/java/com/lin/sort/BucketSort.java @@ -0,0 +1,86 @@ +package com.lin.sort; + +import com.lin.enums.StatusCode; + +import java.util.Arrays; + +public class BucketSort { + + + /** + * 桶排序 + * + * @param sourceArray + * @return + * @throws Exception + */ + public static int[] bucketSorted(int[] sourceArray) { + // 对 arr 进行拷贝,不改变参数内容 + int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); + + return bucketSort(arr, 5); + } + + /** + * 桶排序 + * + * @param arr + * @param bucketSize + * @return + * @throws Exception + */ + private static int[] bucketSort(int[] arr, int bucketSize) { + if (arr.length == 0) { + return arr; + } + + int minValue = arr[0]; + int maxValue = arr[0]; + for (int value : arr) { + if (value < minValue) { + minValue = value; + } else if (value > maxValue) { + maxValue = value; + } + } + + int bucketCount = (int) Math.floor((maxValue - minValue) / bucketSize) + 1; + int[][] buckets = new int[bucketCount][0]; + + // 利用映射函数将数据分配到各个桶中 + for (int i = 0; i < arr.length; i++) { + int index = (int) Math.floor((arr[i] - minValue) / bucketSize); + buckets[index] = arrAppend(buckets[index], arr[i]); + } + + int arrIndex = 0; + for (int[] bucket : buckets) { + if (bucket.length <= 0) { + continue; + } + // 对每个桶进行排序,这里使用了插入排序 + + InsertionSort.insertionSorted(bucket, StatusCode.MIX_SORT); + +// bucket = insertSort.sort(bucket); + for (int value : bucket) { + arr[arrIndex++] = value; + } + } + + return arr; + } + + /** + * 自动扩容,并保存数据 + * + * @param arr + * @param value + */ + private static int[] arrAppend(int[] arr, int value) { + arr = Arrays.copyOf(arr, arr.length + 1); + arr[arr.length - 1] = value; + return arr; + } + +} diff --git a/src/main/java/com/lin/sort/CountingSort.java b/src/main/java/com/lin/sort/CountingSort.java new file mode 100644 index 0000000..f000a3a --- /dev/null +++ b/src/main/java/com/lin/sort/CountingSort.java @@ -0,0 +1,66 @@ +package com.lin.sort; + +import java.util.Arrays; + +/** + * 计数排序 + */ +public class CountingSort { + + + /** + * 计数排序 + * + * @param sourceArray + * @return 返回排序后的数组 + */ + public static int[] countingsorted(int[] sourceArray) { + // 对 arr 进行拷贝,不改变参数内容 + int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); + + int maxValue = getMaxValue(arr); + + return sort(arr, maxValue); + } + + /** + * 统计排序 + * + * @param arr + * @param maxValue + * @return + */ + private static int[] sort(int[] arr, int maxValue) { + int bucketLen = maxValue + 1; + int[] bucket = new int[bucketLen]; + + for (int value : arr) { + bucket[value]++; + } + + int sortedIndex = 0; + for (int j = 0; j < bucketLen; j++) { + while (bucket[j] > 0) { + arr[sortedIndex++] = j; + bucket[j]--; + } + } + return arr; + } + + /** + * 获取最大值 + * + * @param arr + * @return + */ + private static int getMaxValue(int[] arr) { + int maxValue = arr[0]; + for (int value : arr) { + if (maxValue < value) { + maxValue = value; + } + } + return maxValue; + } +} diff --git a/src/main/java/com/lin/sort/RadixSort.java b/src/main/java/com/lin/sort/RadixSort.java new file mode 100644 index 0000000..6c66253 --- /dev/null +++ b/src/main/java/com/lin/sort/RadixSort.java @@ -0,0 +1,107 @@ +package com.lin.sort; + +import java.util.Arrays; + +/** + * 基数排序 + */ +public class RadixSort { + + + /** + * 基数排序 + * + * @param sourceArray + * @return + */ + public static int[] radixSorted(int[] sourceArray) { + // 对 arr 进行拷贝,不改变参数内容 + int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); + + int maxDigit = getMaxDigit(arr); + return radixSort(arr, maxDigit); + } + + /** + * 获取最高位数 + * + * @param arr + * @return + */ + private static int getMaxDigit(int[] arr) { + int maxValue = getMaxValue(arr); + return getNumLenght(maxValue); + } + + /** + * 获取最大值 + * + * @param arr + * @return + */ + private static int getMaxValue(int[] arr) { + int maxValue = arr[0]; + for (int value : arr) { + if (maxValue < value) { + maxValue = value; + } + } + return maxValue; + } + + protected static int getNumLenght(long num) { + if (num == 0) { + return 1; + } + int lenght = 0; + for (long temp = num; temp != 0; temp /= 10) { + lenght++; + } + return lenght; + } + + /** + * 基数排序 + * + * @param arr + * @param maxDigit + * @return + */ + private static int[] radixSort(int[] arr, int maxDigit) { + int mod = 10; + int dev = 1; + + for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) { + // 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10) + int[][] counter = new int[mod * 2][0]; + + for (int j = 0; j < arr.length; j++) { + int bucket = ((arr[j] % mod) / dev) + mod; + counter[bucket] = arrayAppend(counter[bucket], arr[j]); + } + + int pos = 0; + for (int[] bucket : counter) { + for (int value : bucket) { + arr[pos++] = value; + } + } + } + + return arr; + } + + /** + * 自动扩容,并保存数据 + * + * @param arr + * @param value + */ + private static int[] arrayAppend(int[] arr, int value) { + arr = Arrays.copyOf(arr, arr.length + 1); + arr[arr.length - 1] = value; + return arr; + } + + +} diff --git a/src/test/java/com/lin/TestSort/BubbleSortTest.java b/src/test/java/com/lin/TestSort/BubbleSortTest.java index d20ecbb..ba6176f 100644 --- a/src/test/java/com/lin/TestSort/BubbleSortTest.java +++ b/src/test/java/com/lin/TestSort/BubbleSortTest.java @@ -9,7 +9,7 @@ public class BubbleSortTest { @Test public void bubbleSortedTest(){ - int[] a = {1,6,8,2,4,5,7,1,0}; + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; BubbleSort.bubbleSorted(a, StatusCode.MAX_SORT); for (int i : a) { System.out.println(i); diff --git a/src/test/java/com/lin/TestSort/BucketSortTest.java b/src/test/java/com/lin/TestSort/BucketSortTest.java new file mode 100644 index 0000000..41abc9e --- /dev/null +++ b/src/test/java/com/lin/TestSort/BucketSortTest.java @@ -0,0 +1,17 @@ +package com.lin.TestSort; + +import com.lin.sort.BucketSort; +import org.junit.Test; + +public class BucketSortTest { + + + @Test + public void bucketSortedTest() { + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + int[] countingsorted = BucketSort.bucketSorted(a); + for (int i : countingsorted) { + System.out.println(i); + } + } +} diff --git a/src/test/java/com/lin/TestSort/CountingSortTest.java b/src/test/java/com/lin/TestSort/CountingSortTest.java new file mode 100644 index 0000000..ee183b3 --- /dev/null +++ b/src/test/java/com/lin/TestSort/CountingSortTest.java @@ -0,0 +1,17 @@ +package com.lin.TestSort; + +import com.lin.sort.CountingSort; +import org.junit.Test; + +public class CountingSortTest { + + + @Test + public void countingSortedTest() { + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + int[] countingsorted = CountingSort.countingsorted(a); + for (int i : countingsorted) { + System.out.println(i); + } + } +} diff --git a/src/test/java/com/lin/TestSort/HeapSortTest.java b/src/test/java/com/lin/TestSort/HeapSortTest.java index 8a57c96..fe9a2fe 100644 --- a/src/test/java/com/lin/TestSort/HeapSortTest.java +++ b/src/test/java/com/lin/TestSort/HeapSortTest.java @@ -9,8 +9,8 @@ public class HeapSortTest { @Test public void heapSrotTest() { - int[] a = {1,6,8,2,4,5,7,1,0}; - HeapSort.heapSorted(a,StatusCode.MAX_SORT); + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + HeapSort.heapSorted(a, StatusCode.MAX_SORT); for (int i : a) { System.out.println(i); } diff --git a/src/test/java/com/lin/TestSort/InsertionSortTest.java b/src/test/java/com/lin/TestSort/InsertionSortTest.java index 543c400..267f324 100644 --- a/src/test/java/com/lin/TestSort/InsertionSortTest.java +++ b/src/test/java/com/lin/TestSort/InsertionSortTest.java @@ -9,7 +9,7 @@ public class InsertionSortTest { @Test public void insertionSortedtest() { - int[] a = {1,6,8,2,4,5,7,1,0}; + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; InsertionSort.insertionSorted(a, StatusCode.MIX_SORT); for (int i : a) { System.out.println(i); @@ -18,7 +18,7 @@ public class InsertionSortTest { @Test public void insertionSortedDichotomyTest() { - int[] a = {1,6,8,2,4,5,7,1,0}; + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; InsertionSort.insertionSortedDichotomy(a, StatusCode.MIX_SORT); for (int i : a) { System.out.println(i); diff --git a/src/test/java/com/lin/TestSort/MergeSortTest.java b/src/test/java/com/lin/TestSort/MergeSortTest.java index 180110c..8e88977 100644 --- a/src/test/java/com/lin/TestSort/MergeSortTest.java +++ b/src/test/java/com/lin/TestSort/MergeSortTest.java @@ -10,14 +10,14 @@ public class MergeSortTest { @Test public void mergeSortedRecursionTest() { int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; - MergeSort.mergeSortedRecursion(a, StatusCode.MAX_SORT, 0, a.length-1); + MergeSort.mergeSortedRecursion(a, StatusCode.MAX_SORT, 0, a.length - 1); for (int i : a) { System.out.println(i); } } @Test - public void mergeSortedIterationTest(){ + public void mergeSortedIterationTest() { int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; MergeSort.mergeSortedIteration(a, StatusCode.MIX_SORT); for (int i : a) { diff --git a/src/test/java/com/lin/TestSort/QuickSortedTest.java b/src/test/java/com/lin/TestSort/QuickSortedTest.java index a163556..2127f63 100644 --- a/src/test/java/com/lin/TestSort/QuickSortedTest.java +++ b/src/test/java/com/lin/TestSort/QuickSortedTest.java @@ -10,7 +10,7 @@ public class QuickSortedTest { @Test public void quickSortedTest() { int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; - QuickSort.quickSorted(a, 0, a.length - 1,StatusCode.MAX_SORT); + QuickSort.quickSorted(a, 0, a.length - 1, StatusCode.MAX_SORT); for (int i : a) { System.out.println(i); } diff --git a/src/test/java/com/lin/TestSort/RadixSortTest.java b/src/test/java/com/lin/TestSort/RadixSortTest.java new file mode 100644 index 0000000..bc424bd --- /dev/null +++ b/src/test/java/com/lin/TestSort/RadixSortTest.java @@ -0,0 +1,20 @@ +package com.lin.TestSort; + +import com.lin.sort.RadixSort; +import org.junit.Test; + +public class RadixSortTest { + + + @Test + public void radixSortedTest() { + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + int[] countingsorted = RadixSort.radixSorted(a); + for (int i : countingsorted) { + System.out.println(i); + } + } + + + +} diff --git a/src/test/java/com/lin/TestSort/SelectionSortTest.java b/src/test/java/com/lin/TestSort/SelectionSortTest.java index a53ff6f..3981aa6 100644 --- a/src/test/java/com/lin/TestSort/SelectionSortTest.java +++ b/src/test/java/com/lin/TestSort/SelectionSortTest.java @@ -10,7 +10,7 @@ public class SelectionSortTest { @Test public void selectionSortedTest() { int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; - SelectionSort.selectionSorted(a,StatusCode.MIX_SORT); + SelectionSort.selectionSorted(a, StatusCode.MIX_SORT); for (int i : a) { System.out.println(i); } diff --git a/src/test/java/com/lin/TestSort/ShellSortTest.java b/src/test/java/com/lin/TestSort/ShellSortTest.java index f138176..86807ae 100644 --- a/src/test/java/com/lin/TestSort/ShellSortTest.java +++ b/src/test/java/com/lin/TestSort/ShellSortTest.java @@ -7,15 +7,13 @@ import org.junit.Test; public class ShellSortTest { @Test - public void shellSortTest(){ - int[] a = {1,6,8,2,4,5,7,1,0}; - ShellSort.shellSorted(a,StatusCode.MIX_SORT); + public void shellSortTest() { + int[] a = {1, 6, 8, 2, 4, 5, 7, 1, 0}; + ShellSort.shellSorted(a, StatusCode.MIX_SORT); for (int i : a) { System.out.println(i); } } - - } -- Gitee From dd80115ec4d8de80f080c21b673b71d9a0adc02a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=9D=E5=88=86=E7=9F=B3=E4=BA=BA?= <1915803787@qq.com> Date: Wed, 11 Mar 2020 20:52:42 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/lin/App.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/java/com/lin/App.java b/src/main/java/com/lin/App.java index 1133952..0b491be 100644 --- a/src/main/java/com/lin/App.java +++ b/src/main/java/com/lin/App.java @@ -9,13 +9,6 @@ import java.util.Map; public class App { public static void main(String[] args) { - System.out.println("Hello Utils"); - Map