From 06116f15553f525862daa5be67294967db346e22 Mon Sep 17 00:00:00 2001 From: zht Date: Fri, 8 Jan 2021 13:14:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Main.java | 73 ++++++++++++++++ Sort.java | 191 +++++++++++++++++++++++++++++++++++++++++ SortingResultInfo.java | 37 ++++++++ 3 files changed, 301 insertions(+) create mode 100644 Main.java create mode 100644 Sort.java create mode 100644 SortingResultInfo.java diff --git a/Main.java b/Main.java new file mode 100644 index 0000000..2fd5718 --- /dev/null +++ b/Main.java @@ -0,0 +1,73 @@ +import java.util.*; + +public class Main { + //实际测试可以把数组写得大一些 + final static int ArrayLength=10000; + + + + public static void main(String[] args) { + int [] array=new int[ArrayLength]; + for (int i=0;i list=new ArrayList<>(sortTypeArray.length); + for (int i=0;i0&&itemarray[j+1]){ + interchange(array,j,j+1); + isExchange=false; + } + } + if (isExchange){ + //没有交换结束程序 + break; + } + } + return array; + + } + + /** + * 快速排序 + * 从数列中挑出一个元素,称为 "基准"(pivot); + * 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。 + * 在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; + * 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序; + */ + public static int[] quickSort(int [] array){ + return quickSortRecursion(array,0,array.length-1); + } + + private static int[] quickSortRecursion(int [] array,int left, int right){ + if (left 0 && right.length > 0) { + if (left[0] <= right[0]) { + result[i++] = left[0]; + left = Arrays.copyOfRange(left, 1, left.length); + } else { + result[i++] = right[0]; + right = Arrays.copyOfRange(right, 1, right.length); + } + } + + while (left.length > 0) { + result[i++] = left[0]; + left = Arrays.copyOfRange(left, 1, left.length); + } + + while (right.length > 0) { + result[i++] = right[0]; + right = Arrays.copyOfRange(right, 1, right.length); + } + + return result; + } + + + /** + * 希尔排序 + * 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1; + * 按增量序列个数 k,对序列进行 k 趟排序; + * 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。 + */ + public static int[] shellSort(int [] array){ + int length = array.length; + int item; + for (int step=length/2;step>=1;step/=2){ + for (int i=step;i=0 &&array[j]>item){ + array[j+step]=array[j]; + j-=step; + } + array[j+step]=item; + } + } + return array; + } + + /** + * 交换位置 + * @param array + * @param place1 + * @param place2 + */ + private static void interchange(int [] array,int place1,int place2){ + if (place1 !=place2){ + int item = array[place1]; + array[place1] = array[place2]; + array[place2] = item; + } + } + +} \ No newline at end of file diff --git a/SortingResultInfo.java b/SortingResultInfo.java new file mode 100644 index 0000000..db60c01 --- /dev/null +++ b/SortingResultInfo.java @@ -0,0 +1,37 @@ +public class SortingResultInfo implements Comparable { + private String name; + private long startTime ; //获取开始时间 + private long endTime ; //获取结束时间 + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public long getWhen(){ + return endTime-startTime; + } + + @Override + public int compareTo(SortingResultInfo o) { + return (int) (this.getWhen()-o.getWhen()); + } + + @Override + public String toString() { + String replace = String.format("%0" + getWhen()+ "d", 0).replace("0", "▄"); + return getName()+" 用时:"+getWhen()+"ms\t"+replace; + } +} \ No newline at end of file -- Gitee