欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java經(jīng)典排序算法之快速排序代碼實(shí)例

 更新時(shí)間:2023年10月20日 10:08:10   作者:惡魔青葉  
這篇文章主要介紹了Java經(jīng)典排序算法之快速排序代碼實(shí)例,快速排序?qū)崿F(xiàn)的思想是指通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,需要的朋友可以參考下

1.簡介

快速排序,快速排序(Quicksort)是對冒泡排序的一種改進(jìn)。它采用了分治法的策略,數(shù)據(jù)量越大,越能體現(xiàn)快排的速度。

快速排序的平均時(shí)間復(fù)雜度是O(nlogn), 空間復(fù)雜度是O(log2n),是不穩(wěn)定排序。

快速排序?qū)崿F(xiàn)的思想是:指通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序。

整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

總的來說:

  1. 第一步、在數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù) (一般是最左邊的數(shù))。
  2. 第二步、定義兩個(gè)指針:一個(gè)從右往左移動(dòng),找到比基準(zhǔn)數(shù)小的停下 ;另一個(gè)指針從左往右移動(dòng),找到比基準(zhǔn)數(shù)大的停下,交換兩個(gè)指針對應(yīng)的數(shù)。
  3. 第三步、交換完成,繼續(xù)檢索,重復(fù)第二步。
  4. 第四步、當(dāng)兩個(gè)指針相遇,停止檢索,將基準(zhǔn)數(shù)和相遇位置元素交換。此時(shí),第一輪排序結(jié)束。這時(shí)候的數(shù)組特點(diǎn): 基準(zhǔn)數(shù)左邊都小于基準(zhǔn)數(shù), 基準(zhǔn)數(shù)右邊都大于基準(zhǔn)數(shù)
  5. 第五步、采用分治策略,按照上述步驟繼續(xù)排列基準(zhǔn)數(shù)左邊,右邊同理。

看文字理解可能有點(diǎn)云里霧里,接下來我們用圖來解釋下這個(gè)過程。

2.圖解步驟

1.假設(shè)這有個(gè)待排序數(shù)組。我們定義基準(zhǔn)數(shù)為5,定義兩個(gè)指針 i、j

在這里插入圖片描述

2.j指針先從右往左移動(dòng),找到比基準(zhǔn)數(shù)小的,停下,然后i指針向右移動(dòng),找到比基準(zhǔn)數(shù)大的,停下,

在這里插入圖片描述

3.找到了,停下。

在這里插入圖片描述

4.交換兩個(gè)元素。

在這里插入圖片描述

5.重復(fù)上述步驟,直到兩個(gè)指針相遇。

在這里插入圖片描述

6.到這里,基準(zhǔn)數(shù)歸位了。你就會(huì)發(fā)現(xiàn),基準(zhǔn)數(shù)左邊的都小于基準(zhǔn)數(shù) ,基準(zhǔn)數(shù)右邊的都大于基準(zhǔn)數(shù)。

7.現(xiàn)在使用分治法策略,先排左邊,再排右邊,重復(fù)上面的步驟。

在這里插入圖片描述

左邊完成:

在這里插入圖片描述

同理。右邊也是。

在這里插入圖片描述

最終,完成排序。

在這里插入圖片描述

3.代碼實(shí)現(xiàn)

接下來,我們用java語言來實(shí)現(xiàn)一下這個(gè)過程吧。

package com.znzz.quicksort;
//快速排序
import java.util.Arrays;
public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {1,3,65,7,4,6,2};
        System.out.println(Arrays.toString(arr));
       long start =  System.currentTimeMillis(); //獲取系統(tǒng)當(dāng)前時(shí)間(ms)
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
        System.out.println(System.currentTimeMillis() - start); //計(jì)算程序所用時(shí)間(ms)
    }
    // 定義方法,用來快速排序
    public static  void quickSort(int[] arr, int left, int right){
         //判斷,如果左邊大于右邊,不合法,直接return
        if (left > right){
            return;
        }
        //定義變量保存基準(zhǔn)數(shù)
        int base = arr[left];
        //定義變量i,指向最左邊
         int i = left;
        //定義變量j,指向最右邊
        int j = right;
        //開始檢索
        while (i != j) {
            //由j從右往左檢索。檢索到比基準(zhǔn)數(shù)小的就停下,檢索到比基準(zhǔn)數(shù)小大的就據(jù)徐檢索
            while (arr[j] >= base && i < j) {
                j--;   //表示從右往左移動(dòng)
            }
            //i從左往右檢索
            while (arr[i] <= base && i < j) {
                i++;   //表示從左往右移動(dòng)
            }
            //到這,表示i、j都停下了,代表都找到了符合的元素,開始交換對應(yīng)元素。
            swap(arr, i, j);
        }
               //到這,說明i = j,表示相遇了
               //停止檢索,把基準(zhǔn)數(shù)和相遇位置的數(shù)交換。
               arr[left] = arr[i];
               arr[i] = base;
              //基準(zhǔn)數(shù)在這就歸位了,這樣,左邊的數(shù)都比它小,右邊的數(shù)都比他大
              //現(xiàn)在開始排左邊。
            quickSort(arr, left, i-1);
        //現(xiàn)在開始排右邊。
        quickSort(arr, i+1, right);
    }
    public  static  void swap(int [] arr, int i, int j){
        int temp = arr[i];
           arr[i] = arr[j];
            arr[j] = temp;
   }
}

4.總結(jié)

快速排序是不穩(wěn)定的排序,它的時(shí)間復(fù)雜度是O(nlogn): 空間復(fù)雜度是:O(log2n),使用的思想是分治法策略。

到此這篇關(guān)于Java經(jīng)典排序算法之快速排序代碼實(shí)例的文章就介紹到這了,更多相關(guān)Java快速排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中bean對象的裝配方式、作用域及生命周期詳解

    Spring中bean對象的裝配方式、作用域及生命周期詳解

    這篇文章主要介紹了Spring中bean對象的裝配方式、作用域及生命周期詳解,SprignBoot中?@Bean?完美的替換了了上面的這種在xml中配置的方法,使用以下方法就能讓spring在需要自動(dòng)創(chuàng)建Info對象時(shí),自動(dòng)調(diào)用這個(gè)方法,需要的朋友可以參考下
    2023-11-11
  • Java中區(qū)別.toString() ,(String),valueOf()方法

    Java中區(qū)別.toString() ,(String),valueOf()方法

    這篇文章主要介紹了Java中區(qū)別.toString() ,(String),valueOf()方法,需要的朋友可以參考下
    2017-01-01
  • Java String類字符串的理解與認(rèn)知

    Java String類字符串的理解與認(rèn)知

    String字符串和char字符不同,char使用單引號(hào),只能表示一個(gè)字符,字符串就是一段文本。String是個(gè)類。這個(gè)類使用final修飾,所以這個(gè)類是不可以繼承擴(kuò)充和修改它的方法的
    2021-10-10
  • Java實(shí)現(xiàn)多對多網(wǎng)絡(luò)通訊的流程

    Java實(shí)現(xiàn)多對多網(wǎng)絡(luò)通訊的流程

    這篇文章主要介紹了Java實(shí)現(xiàn)多對多網(wǎng)絡(luò)通訊的流程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Spring?Boot?如何通過ServletRequestHandledEvent事件實(shí)現(xiàn)接口請求的性能監(jiān)控

    Spring?Boot?如何通過ServletRequestHandledEvent事件實(shí)現(xiàn)接口請求的性能監(jiān)控

    在Spring框架中,監(jiān)控接口請求的性能可以通過ServletRequestHandledEvent事件實(shí)現(xiàn),這篇文章給大家介紹Spring?Boot?如何通過ServletRequestHandledEvent事件實(shí)現(xiàn)接口請求的性能監(jiān)控,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Java中List集合去重的幾種方式詳細(xì)解析

    Java中List集合去重的幾種方式詳細(xì)解析

    這篇文章主要介紹了Java中List集合去重的幾種方式詳細(xì)解析,在日常的業(yè)務(wù)開發(fā)中,偶爾會(huì)遇到需要將 List 集合中的重復(fù)數(shù)據(jù)去除掉的場景,那么今天我們來看看幾種LIst集合去重的方式,需要的朋友可以參考下
    2023-11-11
  • nacos單機(jī)本地配置文件存儲(chǔ)位置方式

    nacos單機(jī)本地配置文件存儲(chǔ)位置方式

    這篇文章主要介紹了nacos單機(jī)本地配置文件存儲(chǔ)位置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • nacos配置中心持久化相關(guān)配置方式

    nacos配置中心持久化相關(guān)配置方式

    這篇文章主要介紹了nacos配置中心持久化相關(guān)配置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java中OGNL表達(dá)式語言的使用詳解

    Java中OGNL表達(dá)式語言的使用詳解

    本文介紹了OGNL(ObjectGraphNavigationLanguage)表達(dá)式語言,這是一種用于Java語言的對象圖導(dǎo)航和操作的表達(dá)式語言,它支持訪問對象屬性、調(diào)用對象方法、執(zhí)行算術(shù)和邏輯運(yùn)算,以及處理集合和數(shù)組等操作,OGNL的語法簡潔明了
    2024-12-12
  • SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用示例

    SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用示例

    本文主要介紹了SpringBoot中@Insert、@Update實(shí)現(xiàn)批量新增更新的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10

最新評論