各种Java实现的常用排序算法
生活随笔
收集整理的這篇文章主要介紹了
各种Java实现的常用排序算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 冒泡排序
- 堆排序 - heap sort
- 插入排序 - insert sort
- 歸并排序 - merge sort
- 快速排序 - quick sort
- 另一種快速排序
- 選擇排序
- 希爾排序
冒泡排序
package sort;public class bubbleSort {/* (1)基本思想:在要排序的一組數中,對當前還未排好序的范圍內的全部數,* 自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。* 即:每當兩相鄰的數比較后發現它們的排序與排序要求相反時,就將它們互換。* */public static void main(String[] arg) {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 = 0; i < a.length - 1; i++){for(int j = 0;j < a.length - 1 - i;j++){if( a[j] > a[j+1]){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]);}} }堆排序 - heap sort
package sort;import java.util.Arrays;/* 基本思想:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。堆的定義如下:具有n個元素的序列(h1,h2,…,hn),當且僅當滿足(hi>=h2i,hi>=2i+1) 或(hi<=h2i,hi<=2i+1)(i=1,2,…,n/2)時稱之為堆。在這里只討論滿足前者條件的堆。 由堆的定義可以看出,堆頂元素(即第一個元素)必為最大項(大頂堆)。 完全二叉樹可以很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。 初始時把要排序的數的序列看作是一棵順序存儲的二叉樹,調整它們的存儲序, 使之成為一個堆,這時堆的根節點的數最大。然后將根節點與堆的最后一個節點交換。 然后對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆, 并對它們作交換,最后得到有n個節點的有序序列。從算法描述來看,堆排序需要兩個過程, 一是建立堆,二是堆頂與堆的最后一個元素交換位置。所以堆排序有兩個函數組成。 一是建堆的滲透函數,二是反復調用滲透函數實現排序的函數。 */ public class HeapSort {public void heapSort(int[] a){System.out.println("開始排序");int arrayLength = a.length;//循環建堆for(int i = 0;i < arrayLength - 1;i++){//建堆buildMaxHeap(a,arrayLength - 1 - i);//交換堆頂和最后一個元素swap(a,0,arrayLength - 1 - i);System.out.println(Arrays.toString(a));}System.out.println("Final: " + Arrays.toString(a));}private void swap(int[] data, int i, int j) {int tmp = data[i];data[i] = data[j];data[j] = tmp;}//對data數組從0到lastIndex建大頂堆private void buildMaxHeap(int[] data, int lastIndex) {//從lastIndex處節點(最后一個節點)的父節點開始for(int i = (lastIndex - 1)/2; i >= 0; i--){//k保存正在判斷的節點int k = i;//如果當前k節點的子節點存在while(k*2 + 1 <= lastIndex){//k節點的左子節點的索引int biggerIndex = 2*k + 1;//如果biggerIndex小于lastIndex,即biggerIndex+1代表的k節點的右子節點存在if(biggerIndex < lastIndex){//若果右子節點的值較大if(data[biggerIndex] < data[biggerIndex+1 ]){//biggerIndex總是記錄較大子節點的索引biggerIndex++;}}//如果k節點的值小于其較大的子節點的值if(data[k] < data[biggerIndex]){//交換他們swap(data,k,biggerIndex);//將biggerIndex賦予k,開始while循環的下一次循環,重新保證k節點的值大于其左右子節點的值k = biggerIndex;}else{break;}}}}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};HeapSort tool = new HeapSort();tool.heapSort(a);}}插入排序 - insert sort
package sort;public class insertSort {/* 基本思想:在要排序的一組數中,假設前面(n-1)[n>=2] 個數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反復循環,直到全部排好順序。 */ 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]);}} }歸并排序 - merge sort
package sort;import java.util.Arrays;public class mergeSort {public mergeSort(int[] a){sort(a,0,a.length-1);for(int i=0;i<a.length;i++)System.out.println(a[i]);}public void sort(int[] data, int left, int right) {if( left < right){//找出中間索引int center = (left + right)/2;//對左邊數組進行遞歸sort(data,left,center);//對右邊數組進行遞歸sort(data,center + 1,right);//合并merge(data,left,center,right);} }public void merge(int[] data, int left, int center, int right) {int [] tmpArr= new int[data.length];int mid = center + 1;//third記錄中間數組的索引int third = left;int tmp = left;while(left <= center && mid <= right){//從兩個數組中取出最小的放入中間數組if(data[left] <= data[mid]){tmpArr[third++] = data[left++];}else{tmpArr[third++] = data[mid++];}}//剩余部分依次放入中間數組while(mid<=right){tmpArr[third++] = data[mid++];}while(left<=center){tmpArr[third++] = data[left++];}//將中間數組中的內容復制回原數組while(tmp<=right){data[tmp] = tmpArr[tmp++];}System.out.println(Arrays.toString(data)); }public static void main(String[] arg) {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};mergeSort tool = new mergeSort(a);tool.hashCode();} }快速排序 - quick sort
package sort;/* (1)基本思想:選擇一個基準元素,通常選擇第一個元素或者最后一個元素,* 通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大于等于基準元素,* 此時基準元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序劃分的兩部分。* */public class quickSort {public quickSort(int[] a){System.out.println("Jerry Main Entry point for quickSort: ");quick(a);for(int i = 0;i < a.length;i++){System.out.println(a[i]);}}public int getMiddle(int[] list, int low, int high) {System.out.println(" Jerry I am in getMiddle, low: " + low + " high: " + high);int tmp = list[low]; //數組的第一個作為中軸while (low < high){while (low < high && list[high] >= tmp) {System.out.println("tmp: " + tmp + " list[high]: " + list[high]);high--;}System.out.println("Move list[high]: " + list[high] + " to list[low]: " + list[low]);list[low] =list[high]; //比中軸小的記錄移到低端while (low < high&& list[low] <= tmp) {low++;}System.out.println("Move list[low]: " + list[low] + " to list[high]: " + list[high]);list[high] =list[low]; //比中軸大的記錄移到高端}System.out.println("Final !!");list[low] = tmp; //中軸記錄到尾return low; //返回中軸的位置}public void _quickSort(int[] list, int low, int high) {System.out.println("Jerry I am in list: " + list + " low: " + low + " high: " + high);if (low < high){int middle =getMiddle(list, low, high); //將list數組進行一分為二_quickSort(list, low, middle - 1); //對低字表進行遞歸排序_quickSort(list,middle + 1, high); //對高字表進行遞歸排序}}public void quick(int[] a2) {if (a2.length > 0) { //查看數組是否為空_quickSort(a2,0, a2.length - 1);}}public static void main(String[] args) {int a[] = {3,2,4,1};quickSort tool = new quickSort(a);tool.hashCode();System.out.println("ok");}}另一種快速排序
package sort;public class QuickSort2 {private int[] numbers;private int number;public void sort(int[] values) {if (values == null || values.length == 0){return;}this.numbers = values;number = values.length;quicksort(0, number - 1);}private void quicksort(int low, int high) {int i = low, j = high;// 樞軸; 中心點,中樞; [物] 支點,支樞; [體] 回轉運動;int pivot = numbers[low + (high-low)/2];while (i <= j) {while (numbers[i] < pivot) {i++;}while (numbers[j] > pivot) {j--;}if (i <= j) {swap(i, j);i++;j--;}}if (low < j)quicksort(low, j);if (i < high)quicksort(i, high);}private void swap(int i, int j) {int temp = numbers[i];numbers[i] = numbers[j];numbers[j] = temp;}public static void main(String[] args) {int[] array = {1,3,2,4};QuickSort2 tool = new QuickSort2();tool.sort(array);for( int i = 0; i < array.length; i++){System.out.println(array[i]);}}}選擇排序
package sort;/* (1)基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然后在剩下的數當中再找最小的與第二個位置的數交換, 如此循環到倒數第二個數和最后一個數比較為止。 */ public class selectSort {public static void main(String[] args) {int a[] = {1,54,6,3,78,34,12,45};int position = 0;for(int i = 0; i < a.length; i++){int j = i + 1;position = i;int temp = a[i];for(; j < a.length; j++){if( a[j] < temp){temp = a[j];position = j;}}a[position] = a[i];a[i] = temp;}for(int i = 0;i < a.length;i++)System.out.println(a[i]);}}希爾排序
package sort;/* 希爾排序(最小增量排序)(1)基本思想:算法先將要排序的一組數按某個增量d(n/2,n為要排序數的個數)分成若干組, 每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然后再用一個較小的增量(d/2) 對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序后,排序完成。*/ public class shilSort {public static void main(String[] args) {int a[] = {1,54,6,3,78,34,12,45,56,100};double d1 = a.length;int temp = 0;System.out.println("begin...");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 = i - d;temp = a[i];for(; j >= 0 && temp < a[j]; j -= d){a[j+d] = a[j];}System.out.println("Jerry insert value: " + temp + " to Position: < " + (j+d) + " >");a[j+d] = temp;}}if( d == 1){break;}}for(int i = 0; i < a.length;i++){System.out.println(a[i]);}}}總結
以上是生活随笔為你收集整理的各种Java实现的常用排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 米哈游新作《崩坏:星穹铁道》今日公测,登
- 下一篇: 1肖1号期期准 今晚必中码三码