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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法之快速排序

發布時間:2024/2/28 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法之快速排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據結構與算法之快速排序


目錄

  • 快速排序介紹
  • 代碼實現

  • 1. 快速排序介紹

  • 快速排序(Quicksort)是對冒泡排序的一種改進。基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列 。

  • 快速排序:

  • 快速排序法示意圖


  • 2. 代碼實現

    代碼一:隨機快排,長期期望的 O(nlogn)

    package sort;import java.util.Arrays;public class QuickSort {public static void quickSort(int[] arr) {if (arr==null||arr.length<2)return;quickSort(arr,0,arr.length-1);}public static void quickSort(int[] arr,int l,int r) {if (l<r){swap(arr,(int)(l+Math.random()*(r-l+1)),r);int[] p = partition(arr,l,r);quickSort(arr,l,p[0]-1);quickSort(arr,p[1]+1,r);}}private 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])swap(arr,--more,l);else l++;}swap(arr,more,r);return new int[]{less+1,more};}private static void swap(int[] arr, int i, int r) {int tem = arr[i];arr[i] = arr[r];arr[r] = tem;}public static void main(String[] args) {int[] arr = {5, 3, 1, 2, 6, 4, 4};quickSort(arr);System.out.println(Arrays.toString(arr));} }

    代碼二:普通快排

    package com.sort;import java.util.Arrays;public class QuickSort {public static void main(String[] args) {int[] arr = {2,10,8,22,34,5,12,28,21,11};quickSort(arr,0,arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr, int left, int right){int l = left;int r = right;//pivot 中軸int pivot = arr[(left+right)/2];int temp = 0;//while循環的目的是讓比pivot值小放到左邊//比pivot值大放右邊while (l<r){ // 在pivot的左邊一直找,找到大于等于pivot值,才退出while (arr[l]<pivot){l +=1;} // 在pivot的右邊一直找,找到小于等于pivot值,才退出while (arr[r]>pivot){r-=1;}//如果 l>=r ,說明pivot的左右邊的值,已經按照左邊全部是小于等于pivot值//右邊全部是大于等于pivot值if (l>=r){break;}//交換temp = arr[l];arr[l] = arr[r];arr[r] = temp;//如果交換完后,發現pivot,發現arr[l] == pivot值相等 r--, 前移if (arr[l] == pivot){r-=1;}//如果交換完后,發現pivot,發現arr[r] == pivot值相等 l++, 后移if (arr[r] == pivot){l+=1;}}//如果 l==r ,必須l++,r--,否則出現棧溢出if (l == r){l += 1;r -= 1;}//向左遞歸if (left <r){quickSort(arr,left,r);}//向右遞歸if (right>l){quickSort(arr,l,right);}} }

    編譯結果:

    800萬條數據大概2s能排好。

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的数据结构与算法之快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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