Java之排序
1.插入排序
假設第一個數已經是排好序的,把第二個根據大小關系插到第一個前面或維持不動,把第三個根據前面兩個的大小關系插到對應位置,依次往后。
public class InsertSort {public static void main(String[] args){ int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; int temp = 0; for(int i = 1; i < a.length; i++){ int j = i - 1;temp = a[i];for( ; j >= 0&&temp < a[j]; j--) //每次檢查前一個 { a[j+1] = a[j]; //將大于temp的值整體后移一個單位 } a[j+1] = temp; //最后把當前位置的值恢復到對應位置 } for( int i = 0; i < a.length; i++) System.out.println(a[i]); } }選擇排序:最好情況時間復雜度O(n),最差情況時間復雜度為O(n2),平均時間復雜度為O(n2),穩定,空間復雜度為O(1)。
?
2.選擇排序
選擇排序就是選出最值與當前位置的元素交換位置,每次選出一個值,對所有未排序的走一遍。
public class SelectSort {public static void main(String[] args){ int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; int temp; int position = 0;for( int i = 0; i < a.length; i++){temp = a[i];for( int j = i + 1; j <a.length; j++){if( a[j] < temp)//找出最小的,值放在temp,下標放在position {temp = a[j];position = j;}}a[position] = a[i];a[i] = temp;//最小的和當前下標為i的元素交換位置 }for( int i = 0; i < a.length; i++) System.out.println(a[i]); } }選擇排序:最好情況時間復雜度為O(n2),最差情況時間復雜度為O(n2),平均時間復雜度為O(n2),穩定,空間復雜度為O(1)
?
3.冒泡排序
冒泡排序是每當兩相鄰的數比較后發現它們的排序與排序要求相反時,就將它們互換,每一輪都會出一個最大的或者最小的去到對應的位置。
public class BubbleSort {public static void main(String[] args){ int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; int temp; for( int i = 0; i < a.length; i++){for( int j = 0; j <a.length - i - 1; j++){if(a[j+1]<a[j]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}for( int i = 0; i < a.length; i++) System.out.println(a[i]); } }冒泡排序:最好情況時間復雜度為O(n),最壞時間復雜度O(n2),平均時間復雜度為O(n2),穩定,空間復雜度為O(1)
?
4.希爾排序(shell sortion)
算法先將要排序的一組數按某個增量d(n/2,n為要排序數的個數)分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然后再用一個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序后,排序完成。
public class ShellSort {public static void main(String[] args){ int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; int temp; double d1 = a.length;while( true ){d1 = Math.ceil( d1/2);int d = (int) d1;//分組for( int x = 0; x < d; x++){//按照插入排序進行排序for( int i = x + d; i < a.length; i += d){int j;temp = a[i];for( j = i - d; j >= 0 && a[ j] > temp ; j -= d){a[ j + d] = a[ j];}a[ j + d] = temp;}}if(d==1)break;}for( int i = 0; i < a.length; i++) System.out.println(a[i]); } }希爾排序:最好情況時間復雜度為O(n),最壞時間復雜度O(nlgn),平均時間復雜度為O(nlgn),不穩定,空間復雜度為O(1)
?
5.快速排列
選擇一個基準元素,通常選擇第一個元素或者最后一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大于等于基準元素,此時基準元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。
?
public class QuickSort { public static int getMiddle(int[] list, int low, int high) { int tmp = list[low]; //數組的第一個作為中軸 while (low < high) { while (low < high && list[high] >= tmp) { high--; } list[low] = list[high]; //比中軸小的記錄移到低端 while (low < high && list[low] <= tmp) { low++; } list[high] = list[low]; //比中軸大的記錄移到高端 } list[low] = tmp; //中軸記錄到尾 return low; //返回中軸的位置 } public static void _quickSort(int[] list, int low, int high) { if (low < high) { int middle = getMiddle(list, low, high); //將list數組進行一分為二 _quickSort(list, low, middle - 1); //對低字表進行遞歸排序 _quickSort(list, middle + 1, high); //對高字表進行遞歸排序 } } public static void quick(int[] a2) { if (a2.length > 0) { //查看數組是否為空 _quickSort(a2, 0, a2.length - 1); } } public static void main(String[] args){ int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; quick(a);for( int i = 0; i < a.length; i++) System.out.println(a[i]); } }快速排序:最好情況時間復雜度為O(nlgn),最壞時間復雜度O(nlgn),平均時間復雜度為O(nlgn),不穩定,空間復雜度為O(1)
?
6.歸并排序
轉載于:https://www.cnblogs.com/GoForMyDream/p/6227021.html
總結
- 上一篇: Delphi控制Excel输出上标示例
- 下一篇: 关于 ES6 的 let ,var和 c