八大排序:Java实现八大排序及算法复杂度分析
目錄
?
QUESTION:八大排序:Java實現八大排序及算法復雜度分析
ANSWER:
一:冒泡排序
1.算法分析
2.時間復雜度分析
3.代碼
二:選擇排序
1.算法分析
2.時間復雜度分析
3.代碼
三:插入排序
1.算法分析
2.時間復雜度分析
3.代碼
四:歸并排序
1.算法分析
2.時間復雜度分析
3.代碼
五:堆排序
1.算法分析
2.時間復雜度分析
3.代碼
六:快速排序
1.算法分析
2.時間復雜度分析
3.代碼
QUESTION:八大排序:Java實現八大排序及算法復雜度分析
ANSWER:
一:冒泡排序
1.算法分析
冒泡排序是對于一個數組,從第一個數開始,與下一個數進行比較,大的冒后面,小的冒前面,相鄰元素依次比較,完成一次循環,繼續下一次循環,直至數組有序。
圖示:
2.時間復雜度分析
由于冒泡排序是兩層for循環,所以T=O(n^2)。
3.代碼
*** 冒泡排序*/ public class BubbleSort {public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}/*** 比較相鄰元素大小,每次縮減一* @param arr*/public static void bubbleSort(int []arr){if (arr==null){return;}for (int i = arr.length-1; i >0 ; i--) {for (int j = 0; j <i ; j++) {if (arr[j]>arr[j+1]){swap(arr,j,j+1);}}}} }?
?
二:選擇排序
1.算法分析
選擇排序是選擇數組第一個元素假設為最小元素,與后面的所以元素比較,比其它元素大就交換位置,完成一次循環就從第二個元素開始依次上述過程比較,直至數組有序。
圖示:
2.時間復雜度分析n^
由于選擇排序兩層for循環,所以T=O(n^2)。
3.代碼
/*** 選擇排序*/ public class SelectionSort {public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}/*** 假設第一個值為最小元素,每次循環與后一個元素比較找到最小元素* @param arr*/public static void selectionSort(int []arr){if (arr==null){return;}for (int i = 0; i <arr.length-1 ; i++) {int min=i;for (int j = i+1; j <arr.length ; j++) {min=arr[j]<arr[min]?j:min;}swap(arr,i,min);}} }?
?
三:插入排序
1.算法分析
插入排序是從數組第二個元素開始,找前面的數,比較大小,如果前面的數大,就交換位置,然后繼續向前比較,。每次從第幾個元素開始遍歷時都把較小的元素插入到該元素前面,使其前面數組有序,完成一次循環,繼續循環下一個元素直至數組有序。
圖示:
2.時間復雜度分析
由于插入排序兩層for循環,T=O(n^2)。
3.代碼
public class InsertionSort {public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void insertionSort(int []arr){if (arr==null){return;}for (int i = 1; i <arr.length ; i++) {for (int j = i-1; j>=0&&arr[j]>arr[j+1]; j--) {swap(arr,j,j+1);}}} }?
?
四:歸并排序
1.算法分析
歸并排序是利用二分的思想,不斷的將數組進行分割為兩部分,依次比較每部分的最小元素,將最小的元素放入輔助數組,直到所有元素都插入數組,完成排序。
圖示:
2.時間復雜度分析
由于歸并排序是合并的思想,所有T=O(n*logn)。
3.代碼
public class MergeSort {/*** 將數組分段排序插入,然后歸并排序* @param arr* @param l* @param m* @param r*/public static void merge(int []arr,int l,int m,int r){int []help=new int[r-l+1];int i=0;int p1=l;int p2=m+1;while (p1<=m&&p2<=r){help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];}while (p1<=m){help[i++]=arr[p1++];}while (p2<=r){help[i++]=arr[p2++];}for (int j = 0; j <help.length ; j++) {arr[j+l]=help[j];}}/*** 遞歸進行分段歸并* @param arr* @param l* @param r*/public static void mergeSort(int []arr,int l,int r){if (l>=r){return;}int mid=((r-l)>>1)+l;mergeSort(arr,l,mid);mergeSort(arr,mid+1,r);merge(arr,l,mid,r);}/*** 數組歸并排序*/public static void mergeSort(int []arr){if (arr==null){return;}mergeSort(arr,0,arr.length-1);} }?
?
五:堆排序
1.算法分析
堆排序的思想是根據二叉樹的大根堆和小根堆的概念形成,首先依照數組建立大根堆,之后為了防止某一個元素的變化而引起整個大根堆的變化,建立一個修改二叉樹為大根堆的方法,該數組保持大根堆的排序。之后交換大根堆元素,得到有序數組。
圖示:
2.時間復雜度分析
堆排序建立大根堆的過程,T=O(n*logn)。
3.代碼
/*** 堆排序,大根堆,小根堆*/ public class HeapSort{/*** 建立大根堆,當孩子結點大于根結點進行交換,沒有進行左右孩子結點的比較* @param arr* @param index*/public static void heapInsert(int []arr,int index){while(arr[index]>arr[(index-1)/2]){swap(arr,index,(index-1)/2);index=(index-1)/2;}}/*** 修改數組為大根堆* @param arr* @param index* @param size*/public static void heapModifiy(int []arr,int index,int size){int left=2*index+1;while(left<size){//兄弟之間結點排序int largest=arr[left+1]>arr[left]&&(left+1)<size?left+1:left;//孩子結點與根結點進行比較largest=arr[index]>arr[largest]?index:largest;if (largest==index) {break;}swap(arr,index,largest);index=largest;left=2*index+1;}}/*** 堆排序* @param arr*/public static void heapSort(int []arr){if (arr==null||arr.length==0) {return;}for (int i=0;i<arr.length ;i++ ) {heapInsert(arr,i);}int size=arr.length;swap(arr,0,--size);while(size>0){heapModifiy(arr,0,size);swap(arr,0,--size);}}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;} }?
六:快速排序
1.算法分析
快速排序的基本思想是有荷蘭國旗問題的相似,先是隨機產生一個范圍進行數組的劃分,小于區域在左邊,等于區域在中間,等于區域在右邊,直至數組完成排序。
圖示:
2.時間復雜度分析
快速排序T=O(n*logn)。
3.代碼
/*** 快速排序*/ public class QuickSort {/***給定范圍劃分大于區域,等于區域,小于區域排序* @param arr* @param l* @param r* @return*/public static int[] partition(int[] arr, int l, int r) {int less = l - 1;int more = r;while (l < more) {if (arr[l] < arr[r]) {swap(arr,++less,l++);}else if (arr[l]==arr[r]){l++;}else{swap(arr,--more,l);}}swap(arr,more,r);return new int[]{less+1,more};}/*** 產生一個隨機范圍進行劃分排序* @param arr* @param l* @param r*/public static void quickSort(int []arr,int l,int r){if (l<r){swap(arr, l+(int) (Math.random()*(r-l+1)),r);int []partition=partition(arr,l,r);quickSort(arr,l,partition[0]-1);quickSort(arr,partition[1]+1,r);}}/*** 快速排序* @param arr*/public static void quickSort(int []arr){if (arr==null){return;}quickSort(arr,0,arr.length-1);}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;} }?
?
?
?
總結
以上是生活随笔為你收集整理的八大排序:Java实现八大排序及算法复杂度分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国科大高级人工智能7-命题逻辑
- 下一篇: 论文学习11-Adversarial t