本次采用希尔排序、选择排序、插入排序、冒泡排序,测试十万条倒序的数字。看看谁的速度快。
直接看结果:
源码:
先倒叙生成十万条数据,打印到.txt里
package compare;
import java.io.*;
public class util {
public static void main(String[] args) throws FileNotFoundException {
PrintStream pw = new PrintStream(new FileOutputStream("src/compare/reverse_arr.txt"));
for (int i = 100000; i >= 1; i--) {
pw.println(i);
}
System.out.println("打印完成");
}
}
再把十万条数据获取到数组里,方便后面使用
package compare;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
public class data {
public static Integer[] dataint() throws Exception{
ArrayList<Integer> list = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader("src/compare/reverse_arr.txt"));
String line = null;
while ((line = br.readLine()) != null){
int i = Integer.parseInt(line);
list.add(i);
}
br.close();
Integer[] a = new Integer[list.size()];
list.toArray(a);
return a;
}
}
写测试方法
package compare;
import sortDemo.*;
public class SortCompare {
//调用不同的测试方法,完成测试
public static void main(String[] args) throws Exception {
Integer[] shell = data.dataint();
testShell(shell);
Integer[] bubble = data.dataint();
testBubble(bubble);
Integer[] insert = data.dataint();
testInsertion(insert);
Integer[] select = data.dataint();
testSelect(select);
}
//测试希尔排序
public static void testShell(Integer[] a){
long start = System.currentTimeMillis();
ShellTest.sort(a);
long end = System.currentTimeMillis();
System.out.println("希尔排序执行时间为" + (end - start) + "毫秒");
}
//测试插入排序
public static void testInsertion(Integer[] a){
long start = System.currentTimeMillis();
InsertionTest.sort(a);
long end = System.currentTimeMillis();
System.out.println("插入排序执行时间为" + (end - start) + "毫秒");
}
//测试冒泡排序
public static void testBubble(Integer[] a){
long start = System.currentTimeMillis();
BubbleTest.sort(a);
long end = System.currentTimeMillis();
System.out.println("冒泡排序执行时间为" + (end - start) + "毫秒");
}
//测试选择排序
public static void testSelect(Integer[] a){
long start = System.currentTimeMillis();
SelectionTest.sort(a);
long end = System.currentTimeMillis();
System.out.println("选择排序执行时间为" + (end - start) + "毫秒");
}
}
冒泡排序:
package sortDemo;
import java.util.Arrays;
public class BubbleTest {
/**
* 排序原理
* 1.比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
* 2.对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。
*
* O(n^2)
*/
//测试类
public static void main(String[] args) {
Integer[] arr = {5,6,2,1,3,5,0,7};
sort(arr);
System.out.println(Arrays.toString(arr));
}
/*
对数组中的元素进行排序
*/
public static void sort(Comparable[] a){
for (int i = a.length - 1;i > 0;i --){
for (int j = 0; j < i; j++) {
//比较索引j和j+1处的值
if(greater(a[j],a[j+1])){
exch(a,j,j+1);
}
}
}
}
/*
比较v元素是否大于w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
数组元素i和j交换位置
*/
private static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
插入排序:
package sortDemo;
import java.util.Arrays;
public class InsertionTest {
/**
* 排序原理:
* 1.把所有的元素分为两组,已经排序的和未排序的;
* 2.找到未排序的组中的第一个元素,向已经排序的组中进行插入;
* 3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入
* 元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位
*
* O(n^2)
*/
public static void main(String[] args) {
Integer[] arr = {9,6,2,1,3,5,0,7};
sort(arr);
System.out.println(Arrays.toString(arr));
}
/*
对数组a中的元素进行排序
*/
public static void sort(Comparable[] a){
for(int i = 1 ; i < a.length ; i ++) {
for (int j = i ; j > 0; j--) {
if(greater(a[j-1],a[j])){
exch(a,j-1,j);
}else {
break;
}
}
}
}
/*
比较v元素是否大于w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
数组元素i和j交换位置
*/
private static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
选择排序:
package sortDemo;
import java.util.Arrays;
public class SelectionTest {
/**
* 排序原理
* 1.每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于
* 其他某个索引处的值,则假定其他某个索引处的值为最小值,最后可以找到最小值所在的索引。
* 2.交换第一个索引处和最小值所在的索引处的值。
*
* O(n^2)
*/
//测试类
public static void main(String[] args) {
Integer[] arr = {5,6,2,1,3,5,0,7};
sort(arr);
System.out.println(Arrays.toString(arr));
}
/*
对数组a中的元素进行排序
*/
public static void sort(Comparable[] a){
for (int i = 0; i < a.length - 1; i++) {
//定义一个变量,记录最小元素所在的索引,默认为参与选择排序的第一个元素所在的索引
int minIndex = i;
for (int j = i + 1; j < a.length; j++) {
//比较最小索引minIndex处的值和j索引处的值
if (greater(a[minIndex],a[j])){
minIndex = j;
}
}
//交换最小元素所在索引minIndex处的值和索引i处的值
exch(a,i,minIndex);
}
}
/*
比较v元素是否大于w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
数组元素i和j交换位置
*/
private static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
希尔排序:
package sortDemo;
import java.util.Arrays;
public class ShellTest {
/**
* 排序原理
* 1.选一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组;
* 2.对分组好的每一组数据完成插入排序;
* 3.减小增长量,,最小减为1,重复第二步操作。
*
* O(n^2)
*/
//测试类
public static void main(String[] args) {
Integer[] arr = {6,2,1,3,5,0,7};
sort(arr);
System.out.println(Arrays.toString(arr));
}
/*
对数组中的元素进行排序
*/
public static void sort(Comparable[] a){
//1.根据数组a的长度,确定增长量h的初始值;
int h = 1;
while (h < a.length / 2){
h = h * 2 + 1;
}
//2.希尔排序
while (h >= 1){
//排序
//2.1.找到待插入的元素
for (int i = h; i < a.length; i++) {
//2.2把待插入的元素插入到有序数列表中
for (int j = i; j >= h; j -= h) {
//待插入的元素是a[j],比较a[j]和a[j-h]
if (greater(a[j-h],a[j])){
//交换元素
exch(a,j-h,j);
}else {
//待插入元素已经找到了合适的位置,结束循环
break;
}
}
}
//减小h的值
h = h / 2;
}
}
/*
比较v元素是否大于w元素
*/
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
/*
数组元素i和j交换位置
*/
private static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}