堆排序和归并排序 java代码实现
生活随笔
收集整理的這篇文章主要介紹了
堆排序和归并排序 java代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 堆排序
- java代碼實現
- 單元測試
- 歸并排序
- java代碼實現
- 單元測試
堆排序
java代碼實現
package csdn.dreamzuora.sort;import java.util.List;/*** Title: 抽象出排序類* Description:** @version 1.0* @author: weijie* @date: 2020/10/22 17:59*/ public abstract class Sort<E> {public void sort(List<E> array){if (array == null || array.isEmpty()){return;}};public void sort(List<E> array, int left, int right){};} package csdn.dreamzuora.sort;import java.util.List;/*** Title: 堆排序* Description:** @version 1.0* @author: weijie* @date: 2020/10/22 17:51* @url https://www.cnblogs.com/rosesmall/p/9554545.html*/ public class HeapSort extends Sort<Integer>{@Overridepublic void sort(List<Integer> array) {//1.構建大頂堆for(int size = array.size(), i = size / 2 - 1; i >= 0; i--){//從第一個非葉子結點從下至上,從右至左調整結構adjustHeap(array, i, size);}//2.調整堆結構、交換堆頂元素與末尾元素for (int j = array.size() - 1; j > 0; j--){swap(array, 0, j);adjustHeap(array, 0, j);}}/*** 調整大頂堆(僅是調整過程,建立在大頂堆已構建的基礎上)* @param arr* @param i* @param length*/public void adjustHeap(List<Integer> arr, int i, int length){//先取出當前元素iint temp = arr.get(i);//從i結點的左子結點開始,也就是2i+1處開始for(int k = i*2 + 1; k < length; k = k*2 + 1){//如果左子結點小于右子結點,k指向右子結點if(k+1 < length && arr.get(k) < arr.get(k+1)){k++;}//如果子節點大于父節點,將子節點值賦給父節點(不用進行交換)if(arr.get(k) > temp){arr.set(i, arr.get(k)) ;i = k;}else{break;}}//將temp值放到最終的位置arr.set(i, temp);}private void swap(List<Integer> arr, int a, int b){int temp = arr.get(a);arr.set(a, arr.get(b));arr.set(b, temp);} }單元測試
package csdn.dreamzuora.sort;import org.junit.Test; import org.junit.jupiter.api.Assertions;import java.util.Arrays; import java.util.List;import static org.junit.Assert.*;/*** Title:* Description:** @version 1.0* @author: weijie* @date: 2020/10/26 23:14*/ public class HeapSortTest {@Testpublic void sort() {HeapSort heapSort = new HeapSort();List<Integer> list = Arrays.asList(4, 5, 2, 6);heapSort.sort(list);Assertions.assertEquals(Arrays.asList(2, 4, 5, 6), list);} }歸并排序
java代碼實現
package csdn.dreamzuora.sort;import java.util.ArrayList; import java.util.List;/*** Title: 歸并排序* Description:* 將數組進行拆分,拆分后按照一定的順序各自排序,然后再歸并到一起,使得歸并后的數組仍然有序** 歸并排序算法可以利用遞歸的思想或者迭代的思想去實現。首先我們先把一個無序的數組去拆分,然后利用一定的規則,去合并。* 類似于二叉樹的結構。其總的時間復雜度為O( n log n)。空間復雜度為 S(nlogn)** @version 1.0* @author: weijie* @date: 2020/10/22 17:51* @url: https://blog.csdn.net/dreamzuora/article/details/52830740*/ public class MergeSort extends Sort<Integer>{@Overridepublic void sort(List<Integer> a) {if (a == null || a.isEmpty()){return;}List<Integer> b = new ArrayList<>();for (int i = 0; i < a.size(); i++){b.add(0);}merge(a, b,0, a.size());for (int i = 0; i < b.size(); i++){a.set(i, b.get(i));}}private void merge(List<Integer> a, List<Integer> b, int start, int end){//遞歸出口if (end - start <= 1){return;}int mid = (start + end)/2;int left = start;int right = mid;int index = start;//遞歸入口merge(a, b, start, mid);merge(a, b, mid, end);//核心處理while (left < mid || right < end){//右區間遍歷完成,直接取左區間值if (right >= end){b.set(index ++, a.get(left ++));}else if (left < mid && a.get(left) < a.get(right)){b.set(index ++, a.get(left ++));}else {b.set(index ++, a.get(right ++));}}//原數組賦值for (int i = start; i < index; i++){a.set(i, b.get(i));}}}單元測試
package csdn.dreamzuora.sort;import org.junit.Test; import org.junit.jupiter.api.Assertions;import java.util.*;import static org.junit.Assert.*;/*** Title:* Description:** @version 1.0* @author: weijie* @date: 2020/10/28 10:51*/ public class MergeSortTest {@Testpublic void sort() {MergeSort mergeSort = new MergeSort();Random random = new Random();List<Integer> actuallyList = Arrays.asList(random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100));List<Integer> expectList = new ArrayList<>(actuallyList);Collections.sort(expectList);mergeSort.sort(actuallyList);Assertions.assertEquals(expectList, actuallyList);} }總結
以上是生活随笔為你收集整理的堆排序和归并排序 java代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Numpy】array操作总结
- 下一篇: nginx配置文件中参数的作用