日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

排序算法笔记(Java)

發布時間:2024/7/19 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法笔记(Java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package datastructure;import java.util.Arrays; import java.util.Scanner;public class Sort {static int len; //聲明全局變量,用于記錄arr的長度public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();String s[] = str.split(" ");int arr[] = new int[s.length];for (int i=0; i<s.length; i++) {arr[i] = Integer.parseInt(s[i]);}len = arr.length;System.out.println(Arrays.toString(arr)); // bubbleSort(arr); // selectSort(arr); // insertSort(arr); // quickSort(arr, 0, arr.length-1); // shellSort(arr);heapSort(arr);System.out.println(Arrays.toString(arr));}/*** 冒泡排序(穩定)** 每次比較相鄰元素,如果第一個比第二個大,則交換。* 對每一對相鄰元素作同樣工作,從第一對到最后一對。* 每輪之后最后的元素是最大值。** 時間復雜度 O(n^2)* 空間復雜度 O(1)* @param arr* @return*/public static int[] bubbleSort(int[] arr) {if (len == 0) {return arr;}for (int i=0; i<len-1; i++) {for (int j=0; j<len-1-i; j++) {if (arr[j] > arr[j+1]) {int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}return arr;}/*** 選擇排序(不穩定)** 1、從第一個元素開始,該元素可以認為已經被排序(最小/最大)* 2、在未排序的元素序列中從前向后掃描,找比該元素(已排序)小的最小值* 3、如果找到,兩者互換。* 4、以此類推,直到所有元素均排序完畢。** 時間復雜度為 O(n^2)。* 空間復雜度 O(1)** @param arr* @return*/public static int[] selectSort(int[] arr) {if (len == 0) {return arr;}for (int i=0; i<len; i++) {int minIndex = i;for (int j=i; j<len; j++) {if (arr[j] < arr[minIndex])minIndex = j;}int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}return arr;}/*** 直接插入排序(穩定)* 1、從第一個元素開始,該元素可以認為已經被排序;* 2、取出下一個元素,在已經排序的元素序列中從后向前掃描;* 3、如果該元素(已排序)大于新元素,將該元素移到下一位置;* 4、重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;* 5、將新元素插入到該位置后;* 6、重復步驟2~5。** 時間復雜度 O(n^2)* 空間復雜度 O(1)* @param arr* @return*/public static int[] insertSort(int[] arr) {if (len == 0) {return arr;}for (int i=0; i<len-1; i++) {for (int j=i+1; j>0; j--) {if (arr[j] < arr[j-1]) {int temp = arr[j];arr[j] = arr[j-1];arr[j-1] = temp;}}}return arr;}/*** 希爾排序[縮小增量排序](不穩定)* 將待排序數組按照步長gap進行分組,* 然后將每組的元素利用直接插入排序的方法進行排序;* 每次再將gap折半減小,循環上述操作;* 當gap=1時,利用直接插入,完成排序。** 時間復雜度:O(nlogn)* 空間復雜度 O(1)* @param arr* @return*/public static int[] shellSort(int[] arr) {if (len == 0) {return arr;}int temp, gap = len / 2;while (gap > 0) {for (int i=gap; i < len; i++) {temp = arr[i];int preIndex = i - gap;while (preIndex >= 0 && arr[preIndex] > temp) {arr[preIndex + gap] = arr[preIndex];preIndex -= gap;}arr[preIndex + gap] = temp;}gap /= 2;}return arr;}/*** 快速排序(不穩定)* 【https://www.bilibili.com/video/BV1at411T75o】* 1、從數列中挑出一個元素,稱為"基準"(pivot)* 2、重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準后面* 3、遞歸地把小于基準值元素的子數列和大于基準值元素的子數列排序。** 時間復雜度 O(nlogn)* 空間復雜度 O(logn)* @param arr* @param L* @param R*/public static void quickSort(int[] arr, int L, int R) {if (L >= R) {return ;}int left = L;int right = R;int pivot = arr[left];while (left < right) {// 從后向前找到比pivot小的元素while (left<right && arr[right]>=pivot){right--;}arr[left] = arr[right];// 從前向后找到比pivot大的元素while (left<right && arr[left]<=pivot){left++;}arr[right] = arr[left];}// 放置基準值,準備分治遞歸快排arr[left] = pivot;quickSort(arr, L, right-1);quickSort(arr, right+1, R);}/*** 堆排序 (不穩定)** 時間復雜度:O(nlogn)* 空間復雜度 O(1)* @param arr* @return*/public static int[] heapSort(int[] arr) {if (len == 0) {return arr;}for (int i=len-1; i>0; i--) {buildMaxHeap(arr, i);int temp = arr[0];arr[0] = arr[i];arr[i] = temp;}return arr;}/*** 建立最大堆* @param arr*/public static void buildMaxHeap(int[] arr, int n) {int child;for (int i=(n-1)/2; i>=0; i--) {//左節點child = 2 * i + 1;//右節點存在且大于左節點,child變為右節點if (child !=n && arr[child] < arr[child+1]) {child++;}//交換父節點與左右子節點中的最大值if (arr[i] < arr[child]) {int temp = arr[i];arr[i] = arr[child];arr[child] = temp;}}} }

總結

以上是生活随笔為你收集整理的排序算法笔记(Java)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。