几种排序算法的Java实现

来源:互联网 发布:那个答题软件好用 编辑:程序博客网 时间:2024/05/18 07:40

最近自己学习了一下排序算法,把代码贴在这里留个纪念!

代码大部分抄/改自---《Algorithms第四版》

import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.LinkedList;import java.util.List;import java.util.Scanner;public class HelloWorl {    public static void main(String[] args)    {//    String[] a = new String[10];//    Scanner scan =new Scanner(System.in);//    for(int i = 0; i < a.length; i++)//    {//    a[i] = scan.nextLine();//    }//        String[] a = new String[]{"S","O","R","T","E","X","A","M","P","L","E"};    //    BubbleSort exsort = new BubbleSort();    HeapSort exsort = new HeapSort();    //System.out.println(exsort.isSorted(a));    exsort.sort(a);    //System.out.println(exsort.isSorted(a));    //exsort.show(a);    for(int i = 0; i < a.length;i ++)    {    System.out.println(a[i]);    }    }}class ExampleSort{static void sort(Comparable[] a){//在子类中将其重载}protected static boolean less(Comparable v,Comparable w){return v.compareTo(w) < 0;}protected static void exch(Comparable a[],int i,int j){Comparable t;t = a[i];a[i] = a[j];a[j] = t;}public static void show(Comparable[] a){for(Comparable i:a){System.out.println(i);}}public static boolean isSorted(Comparable[] a)//测试所有元素是否有序{for(int i = 1;i < a.length; i++){if(less(a[i],a[i-1])){return false;}}return true;}}//选择排序class SelectionSort extends ExampleSort{public static void sort(Comparable[] a){for(int i = 0; i < a.length; i++){int min;min = i;for(int j = i+1; j < a.length; j++){if(less(a[j],a[min])){min = j;}}exch(a,i,min);}}}//插入排序class InsertionSort extends ExampleSort{public static void sort(Comparable[] a){for(int i = 1; i < a.length; i++){//for(int j = 0; j < i; j++)//自己实现的野路子,效率应该与书上比应该差不多//{//if(less(a[i],a[j]))//{//Comparable temp = a[i];//for(int k = i; k > j; k--)//{//a[k] = a[k-1];//}//a[j] = temp;//}//}for(int j = i; j > 0 ;j--){if(less(a[j],a[j-1])){exch(a,j,j-1);}}}}}//希尔排序class ShellSort extends ExampleSort//希尔排序{public static void sort(Comparable[] a){int N = a.length;int h = 1;while(h < N/3){h = h*3 + 1;}while(h >= 1){for(int i = h; i <N; i++){for(int j = i; j >= h; j -= h){if(less(a[j],a[j-h])){exch(a,j,j-h);}}}h = h/3;System.out.println("the h is: " +h);}}}//归并排序class MergeSort extends ExampleSort{private static Comparable[] aux;//public static void sort(Comparable[] a)//{//aux = new Comparable[a.length];//sort(a,0,a.length - 1);//}////private static void sort(Comparable[] a, int lo, int hi)//{//if(lo >= hi) return;////int mid = lo + (hi - lo)/2;//sort(a, lo, mid);//sort(a, mid+1, hi);//merge(a, lo, mid, hi);//}//自底向上的归并public static void sort(Comparable[] a){aux = new Comparable[a.length];for(int sz = 1; sz < a.length ; sz *= 2){for(int lo = 0; lo < a.length - sz; lo += sz+sz){merge(a,lo,lo + sz - 1, Math.min(lo + sz + sz -1, a.length - 1));}}}private static void merge(Comparable[] a, int lo, int mid, int hi){int i = lo;int j = mid +1;for(int k = lo; k <= hi; k++){aux[k] = a[k];}for(int k = lo; k <= hi; k++){if(i > mid){a[k] = aux[j++];}else if(j > hi){a[k] = aux[i++];}else if(less(aux[i],aux[j])){a[k] = aux[i++];}else{a[k] = aux[j++];}}}}//快速排序class QuickSort extends ExampleSort{public static void sort(Comparable[] a){sort(a,0,a.length-1);}private static void sort(Comparable[] a, int lo, int hi){////改进,当数组较小时进行插入排序//int M = 5;//if(lo + M >= hi)//{//InsertionSort.sort(a);//return;//}//if(lo >= hi)//如果不能再切分了,就不切分了return;//切分成两个字串,递归int j = partition(a,lo,hi);sort(a,lo,j-1);sort(a,j+1,hi);}private static int partition(Comparable[] a, int lo, int hi){int i = lo;int j = hi +1;Comparable v = a[lo];//最左边的while(true){//从左边开始找到大于v的while(less(a[++i],v)){if(i == hi)break;}//从右边开始找到小于v的while(less(v,a[--j])){if(j == lo)break;}//如果找完了就停止if(i >= j)break;//交换左边那个比v大的,右边那个比v小的exch(a,j,i);//这样交换后的i及左边都比v小,j及右边都比v大。//下一个循环的两端是i和j现在所处的位置//循环结束后,j左边都是比v小的,j右边都是比v大的}//交换a[j]和v,v就到了应该在的位置上。exch(a,lo,j);//返回j,用于将串分成两个字串。return j;}}//冒泡排序class BubbleSort extends ExampleSort{public static void sort(Comparable[] a){for(int i = 0; i <= a.length - 1; i++){for(int j = 0; j < a.length - i - 1; j++){if(less(a[j+1],a[j]))exch(a,j,j+1);}}}}//冒泡改进,鸡尾酒算法    但是在乱数序列的状态下,鸡尾酒排序与冒泡排序的效率都很差劲class CooktailSort extends ExampleSort{public static void sort(Comparable[] a){int left = 0;int right = a.length -1;while(left <= right){for(int i = left; i < right; i ++){if(less(a[i + 1],a[i])){exch(a,i,i+1);}}right--;for(int i = right; i > left ; i--){if(less(a[i],a[i - 1])){exch(a,i,i-1);}}left++;}}}//堆排序class HeapSort{public void sort(Comparable[] a){Comparable[] temp = new Comparable[a.length + 1];for(int i = 0; i < a.length; i++){temp[i+1] = a[i];}int N = temp.length - 1;for(int k = N/2; k >= 1;k--){sink(temp,k,N);}//System.out.println(temp.length);//System.out.println(temp[]);for(int k = N ; k >= 1; k--){//System.out.println(temp[0]);//这里错把temp写成了a,调了一晚上exch(temp,1,k);//System.out.println("fghj");sink(temp,1,k-1);}for(int i = 1; i < temp.length; i++){a[i-1] = temp[i];}}private void sink(Comparable[] a,int m,int N){//System.out.println("N= " + N);while(2*m <= N){//System.out.println(m);int j = 2*m;if(j < N && less(a,j,j+1))  j++;if(!less(a,m,j)) break;exch(a,m,j);m = j;}}private boolean less(Comparable[] a, int i, int j){return a[i].compareTo(a[j]) < 0;}private void exch(Comparable[] a, int i, int j){Comparable temp;temp = a[i];a[i] = a[j];a[j] = temp;}}


原创粉丝点击