package test.sort; public class TestSort { /** * 冒泡排序(升序) * 思想:将要排序的元素看做是竖着的排序的气泡,较小的元素比较轻,从而要往上符。在冒泡排序算法中我们要 * 对这个气泡序列处理若干遍,所谓一遍处理,就是自底向上检查一遍这个序列。并时刻注意两个相邻的元素的顺序 * 是否正确,如果发现两个相邻元素的顺序不对,即轻的元素子下面,就交互他们的位置,显然,处理一遍之后,最轻 * 的元素就浮到最高位置,处理二遍之后,次轻的元素就浮到次高位置,在做第二编处理时,由于最高位置的元素已是 * 最轻的元素,所以不必检查,一般地,第i编处理时,不必检查第i高位置以上的元素,应为前面i-1编的处理,他们 * 正确的排好序。 * @param src 待排序数组 */ private static void toBubbleSortAsc(int[] src){ long start = System.currentTimeMillis(); for(int k=0;k<1000000;k++){ for(int i=0;i<src.length;i++){ for(int j=i+1;j<src.length;j++){ int temp; if(src[i]>src[j]){ temp=src[j]; src[j]=src[i]; src[i]=temp; } } } } System.out.println("冒泡排序(升序)如下,耗时:"+ (System.currentTimeMillis() - start)); } /** * 冒泡排序(降序) * @param src 待排序数组 */ private static void toBubbleSortDesc(int[] src){ long start = System.currentTimeMillis(); for(int k=0;k<1000000;k++){ for(int i=0;i<src.length;i++){ for(int j=i+1;j<src.length;j++){ int temp; if(src[i]<src[j]){ temp=src[j]; src[j]=src[i]; src[i]=temp; } } } } System.out.println("冒泡排序(降序)如下,耗时:"+ (System.currentTimeMillis() - start)); } /** * 选择排序 * 思想:对待排序的记录序列进行n-1编处理,第1编处理是将L[1..n]中最小者与L[1]交互位置第2编处理是将 * L[2..n]中最小者与L[2]交换位置,...,第i编处理是将L[i..n]中最小者与L[i]交互位置,这样,经过i编处理 * 后,前i个记录的位置就已经按从小到大顺序排序好了。 * 当然,实际操作时,也可以根据需要,通过从待排序的记录中选择最大这与其首记录交互位置,按降序排序处理 * @param src 待排序数组 */ private static void doChooseSort(int[] src){ long start = System.currentTimeMillis(); for(int k=0;k<1000000;k++){ int temp; for(int i=0;i<src.length;i++){ temp=src[i]; //最小数下标 int smallLocation=i; for(int j=i+1;j<src.length;j++){ if(src[j]<temp){ //取出最小数 temp=src[j]; //最小数下标 smallLocation=j; } } src[smallLocation]=src[i]; src[i]=temp; } } System.out.println("选择排序如下,耗时:"+ (System.currentTimeMillis() - start)); } /** * 插入排序 (while循环) * @param src 待排序数组 */ private static void doInsertSortWhile(int[] src){ long start = System.currentTimeMillis(); for(int k=0;k<1000000;k++){ for(int i=1;i<src.length;i++){ int temp = src[i]; int j=i; while(src[j-1]>temp){ src[j]=src[j-1]; j--; if (j<=0) break; } src[j]=temp; } } System.out.println("插入排序 (while循环)如下,耗时:"+ (System.currentTimeMillis() - start)); } /** * 插入排序 (for循环) * @param src 待排序数组 */ private static void doInsertSortfor(int[] src){ long start = System.currentTimeMillis(); for(int k=0;k<1000000;k++){ for(int i=1;i<src.length;i++){ int temp=src[i]; int j; for (j=1;j>0;j--){ if(src[j-1]>temp){ src[j]=src[j-1]; }else{ break; } } src[j]=temp; } } System.out.println("插入排序 (for 循环)如下,耗时:"+ (System.currentTimeMillis() - start)); } public static void main(String[] args){ int[] src=new int[]{3,5,1,2,7,8,4}; //冒泡排序(升序) TestSort.toBubbleSortAsc(src); for(int i=0;i<src.length;i++){ System.out.print(src[i]+" "); } //冒泡排序(降序) System.out.println(); TestSort.toBubbleSortDesc(src); for(int i=0;i<src.length;i++){ System.out.print(src[i]+" "); } //选择排序 System.out.println(); TestSort.doChooseSort(src); for(int i=0;i<src.length;i++){ System.out.print(src[i]+" "); } //插入排序 (while循环) System.out.println(); TestSort.doInsertSortWhile(src); for(int i=0;i<src.length;i++){ System.out.print(src[i]+" "); } //插入排序 (for循环) System.out.println(); TestSort.doInsertSortfor(src); for(int i=0;i<src.length;i++){ System.out.print(src[i]+" "); } } }