本人在複習core java之時,將四大排序拿出來,封裝成了工具方法,給學過的同學溫習和總結下,也給新來的同學增加下知識。
下面爲工具方法,已封裝成工具類,有興趣的同學,可以複製過去,以備調用。
package org.tarena.liyunhua.utils;
import java.util.Arrays;
import java.util.Random;
public class SortUtil {
/**
* 冒泡排序,param參數,asc爲升序,desc爲降序
*
* @param arr
* @param param
* @return
*/
public static int[] maopao(int[] arr, String param) {
int t;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1-i; j++) {
if (param.equals("asc")) {
if (arr[j + 1] < arr[j]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
}
} else if (param.equals("desc")) {
if (arr[j] < arr[j + 1]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
}
}
}
}
return arr;
}
/**
* 冒泡排序,默認asc方式排序
* 基本思路:相鄰兩個數,比較大小,升序,大的交換位置下沉。降序,小的交換位置也往下沉.
* @param arr
* @return
*/
public static int[] maopao(int[] arr) {
int t;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1-i; j++) {
if (arr[j + 1] < arr[j]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
}
}
}
return arr;
}
/**
* 插入排序,param參數,asc爲升序,desc爲降序
*/
public static int[] insertSort(int[] arr, String param) {
for (int i = 1; i < arr.length; i++) {
int k = arr[i];
int j;
if ("asc".equals(param.toLowerCase())) {
for (j = i - 1; j >= 0 && k < arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = k;
} else if ("desc".equals(param.toLowerCase())) {
for (j = i - 1; j >= 0 && k > arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = k;
}
}
return arr;
}
/**
* 插入排序,默認asc排序
*基本思路:將要排序的數組分成兩部分,每次從後面的數組部分中取出索引最小的數組元素,
*插入到前面數組部分的適當位置中。通常用在開始排序時,將數組的第一個
*元素作爲一組,後面的所有元素被當成另一組。
*/
public static int[] insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int k = arr[i];
int j;
for (j = i - 1; j >= 0 && k < arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = k;
}
return arr;
}
/**
* 選擇排序 ,默認升序
*基本思路:將要排序的數組分成兩部分,一部分是從小到大已經排序好的,一部是無序的,
*從無序的部分取出最小的數組,放到已經排好序的部分的最後。
* @param args
*/
public static int[] xuanze(int[] arr){
int t;
for(int i=0;i<arr.length;i++){
int m=i;
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[m]){
m=j;
}
}
if(i!=m){
t=arr[i];
arr[i]=arr[m];
arr[m]=t;
}
}
return arr;
}
/**
* 選擇排序 ,param參數,asc爲升序,desc爲降序
* @param args
*/
public static int[] xuanze(int[] arr,String param){
int t;
for(int i=0;i<arr.length;i++){
int m=i;
for(int j=i+1;j<arr.length;j++){
if("asc".equals(param.toLowerCase())){
if(arr[j]<arr[m]){
m=j;
}
}else if("desc".equals(param.toLowerCase())){
if(arr[j]>arr[m]){
m=j;
}
}
}
if(i!=m){
t=arr[i];
arr[i]=arr[m];
arr[m]=t;
}
}
return arr;
}
/**
* 產生一個length長度的隨機數組,方法
* @param length
* @return
*/
public static int[] randomArrays(int length){
int[] arr = new int[length];
for (int i = 0; i < arr.length; i++) {
arr[i]=new Random().nextInt(8888);
}
return arr;
}
//快速排序,基本思路:將一個大的數組的排序問題,分解成2個小的數組的排序,而每個小的數組的排序,
//又可繼續分解成更小的2個數組,這樣一直遞歸分解下去,直到數組的大小最大爲2。
//下面是用main進行測試
public static void main(String[] args) {
int[] arr=SortUtil.randomArrays(8888);
//選擇排序
//System.out.println("選擇排序隨機數組爲: "+Arrays.toString(arr));
System.out.println("----------選擇排序 開始----------");
long start=System.currentTimeMillis();
SortUtil.xuanze(arr);
//System.out.println(Arrays.toString(arr));
System.out.println("選擇排序用時 "+(System.currentTimeMillis()-start)+" 毫秒");
System.out.println("----------選擇排序 結束----------");
arr=SortUtil.randomArrays(8888);
//插入排序
//System.out.println("插入排序隨機數組爲: "+Arrays.toString(arr));
System.out.println("----------插入排序 開始----------");
start=System.currentTimeMillis();
SortUtil.insertSort(arr);
//System.out.println(Arrays.toString(arr));
System.out.println("插入排序用時 "+(System.currentTimeMillis()-start)+" 毫秒");
System.out.println("----------插入排序 結束----------");
arr=SortUtil.randomArrays(8888);
// 冒泡排序
//System.out.println("冒泡排序隨機數組爲: "+Arrays.toString(arr));
System.out.println("----------冒泡排序開始----------");
start=System.currentTimeMillis();
SortUtil.maopao(arr);
//System.out.println(Arrays.toString(arr));
System.out.println("冒泡排序 用時 "+(System.currentTimeMillis()-start)+" 毫秒");
System.out.println("----------冒泡排序 結束----------");
arr=SortUtil.randomArrays(8888);
// 快速排序(Arrays.sort)
//System.out.println("快速排序隨機數組爲: "+Arrays.toString(arr));
System.out.println("----------快速排序 開始----------");
start=System.currentTimeMillis();
Arrays.sort(arr);
//System.out.println(Arrays.toString(arr));
System.out.println("快速排序 用時 "+(System.currentTimeMillis()-start)+" 毫秒");
System.out.println("----------快速排序 結束----------");
}
}
隨機產生8888位數組,下面爲測試結果
----------選擇排序 開始----------
選擇排序用時 94 毫秒
----------選擇排序 結束----------
----------插入排序 開始----------
插入排序用時 47 毫秒
----------插入排序 結束----------
----------冒泡排序開始----------
冒泡排序 用時 203 毫秒
----------冒泡排序 結束----------
----------快速排序 開始----------
快速排序 用時 16 毫秒
----------快速排序 結束----------
總結:
快速排序,16毫秒,當之無愧第一名
插入排序,47毫秒 , 排在第二名
選擇排序,94毫秒, 排在第三名
冒泡排序,203毫秒,遠遠落最後名