最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

比較排序之快速排序(實(shí)例代碼)

 更新時(shí)間:2017年06月27日 09:19:26   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇比較排序之快速排序(實(shí)例代碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

快速排序(簡(jiǎn)稱快排)因?yàn)槠湫瘦^高(平均O(nlogn))經(jīng)常在筆試題中對(duì)其考查。

對(duì)于快排的第一步是選取一個(gè)“基數(shù)”,將會(huì)用這個(gè)“基數(shù)”與其它數(shù)進(jìn)行比較交換。而這個(gè)“基數(shù)”的選擇將影響到快排的效率如何,但如果為了選擇基數(shù)而選擇基數(shù)則會(huì)本末倒置。例如為了找到最佳基數(shù),則需要在整個(gè)待排序列中找到中位數(shù),但查找中位數(shù)實(shí)際上代價(jià)又會(huì)很高。基數(shù)的選擇通常來(lái)說(shuō)就是待排序序列中的第一個(gè)對(duì)象或者中間的一個(gè)對(duì)象或者最后一個(gè)對(duì)象。本文以選取第一個(gè)元素為例對(duì)快排做一個(gè)簡(jiǎn)要分析實(shí)現(xiàn)。

以待排序列{6, 5, 3, 1, 7, 2, 4}為例,選取第一個(gè)元素6為基數(shù)。

選擇了基數(shù)過(guò)后則需要進(jìn)行和數(shù)組元素進(jìn)行比較交換,如何進(jìn)行比較和誰(shuí)進(jìn)行比較?快排第二步在數(shù)組的第一個(gè)元素和最后元素各設(shè)置一個(gè)“哨兵”。

選好基數(shù),設(shè)置好哨兵過(guò)后,接下來(lái)則是開始比較,將基數(shù)先與最后一個(gè)哨兵j進(jìn)行比較,如果大于哨兵j則與其進(jìn)行交換同時(shí)哨兵i+1

此時(shí)基數(shù)不再與哨兵j進(jìn)行比較,而是與哨兵i進(jìn)行比較,如果基數(shù)大于哨兵i,則哨兵一直向后移,直到大于基數(shù)為止交換同時(shí)哨兵j-1。

重復(fù)上面的步驟,基數(shù)再與哨兵j比較。

最終結(jié)果可見哨兵i的位置=哨兵j的位置,此時(shí)將基數(shù)賦值給這個(gè)位置。

這樣就達(dá)到了基數(shù)6左邊的數(shù)字均小于它,右邊的數(shù)字均大于它,再利用遞歸對(duì)其左右數(shù)組進(jìn)行同樣的步驟選取基數(shù),設(shè)置哨兵,最后即可完成排序。

java

package com.algorithm.sort.quick;

import java.util.Arrays;

/**
 * 快速排序
 * Created by yulinfeng on 2017/6/26.
 */
public class Quick {
  public static void main(String[] args) {
    int[] nums = {6, 5, 3, 1, 7, 2, 4};
    nums = quickSort(nums, 0, nums.length - 1);
    System.out.println(Arrays.toString(nums));
  }
  
  /**
   * 快速排序
   * @param nums 待排序數(shù)組序列
   * @param left 數(shù)組第一個(gè)元素索引
   * @param right 數(shù)組最后一個(gè)元素索引
   * @return 排好序的數(shù)組序列
   */
  private static int[] quickSort(int[] nums, int left, int right) {
    if (left < right) {
      int temp = nums[left];  //基數(shù)
      int i = left;  //哨兵i
      int j = right;  //哨兵j
      while (i < j) {
        while (i < j && nums[j] >= temp) {
          j--;
        }
        if (i < j) {
          nums[i] = nums[j];
          i++;
        }
        while (i < j && nums[i] < temp) {
          i++;
        }
        while (i < j) {
          nums[j] = nums[i];
          j--;
        }
      }
      nums[i] = temp;
      quickSort(nums, left, i - 1);
      quickSort(nums, i + 1, right);
    }
    return nums;
  }
}

Python3

#快速排序
def quick_sort(nums, left, right):
  if left < right:
    temp = nums[left]  #基數(shù)
    i = left  #哨兵i
    j = right  #哨兵j
    while i < j:
      while i < j and nums[j] >= temp:
        j -= 1
      if i < j:
        nums[i] = nums[j]
        i += 1
      while i < j and nums[i] < temp:
        i += 1
      if i < j:
        nums[j] = nums[i]
        j -= 1
    nums[i] = temp
    quick_sort(nums, left, i - 1)
    quick_sort(nums, i + 1, right)
  
  return nums

nums = [6, 5, 3, 1, 7, 2, 4]
nums = quick_sort(nums, 0, len(nums) - 1)
print(nums)

以上這篇比較排序之快速排序(實(shí)例代碼)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • swagger?@ApiModel添加實(shí)體類不生效的解決

    swagger?@ApiModel添加實(shí)體類不生效的解決

    這篇文章主要介紹了swagger?@ApiModel添加實(shí)體類不生效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • java?zxing合成復(fù)雜二維碼圖片示例詳解

    java?zxing合成復(fù)雜二維碼圖片示例詳解

    這篇文章主要為大家介紹了java?zxing合成復(fù)雜二維碼圖片示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Java實(shí)現(xiàn)AOP代理的三種方式詳解

    Java實(shí)現(xiàn)AOP代理的三種方式詳解

    AOP是一種設(shè)計(jì)思想,是軟件設(shè)計(jì)領(lǐng)域中的面向切面編程,它是面向?qū)ο缶幊痰囊环N補(bǔ)充和完善。本文將用Java實(shí)現(xiàn)AOP代理的三種方式,需要的可以參考一下
    2022-07-07
  • SpringBoot?spring.factories加載時(shí)機(jī)分析

    SpringBoot?spring.factories加載時(shí)機(jī)分析

    這篇文章主要為大家介紹了SpringBoot?spring.factories加載時(shí)機(jī)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題

    Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題

    這篇文章主要介紹了Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java綜合整理堆排序?快速排序?歸并排序

    Java綜合整理堆排序?快速排序?歸并排序

    堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)而設(shè)計(jì)的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時(shí)間復(fù)雜度均為O(nlogn),它也是不穩(wěn)定排序。首先簡(jiǎn)單了解下堆結(jié)構(gòu)
    2022-01-01
  • 在Java中避免NullPointerException的解決方案

    在Java中避免NullPointerException的解決方案

    這篇文章主要介紹了在Java中避免NullPointerException的解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Spring Boot使用Druid和監(jiān)控配置方法

    Spring Boot使用Druid和監(jiān)控配置方法

    Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,并且能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能。下面來(lái)說(shuō)明如何在 Spring Boot 中配置使用Druid
    2017-04-04
  • Java多線程Future實(shí)現(xiàn)優(yōu)雅獲取線程的執(zhí)行結(jié)果

    Java多線程Future實(shí)現(xiàn)優(yōu)雅獲取線程的執(zhí)行結(jié)果

    這篇文章主要為大家詳細(xì)介紹了Java如何利用Future實(shí)現(xiàn)優(yōu)雅獲取線程的執(zhí)行結(jié)果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • MyBatis-Plus實(shí)現(xiàn)優(yōu)雅處理JSON字段映射

    MyBatis-Plus實(shí)現(xiàn)優(yōu)雅處理JSON字段映射

    默認(rèn)情況下,MyBatis-Plus 是不支持直接映射 JSON 類型的,這時(shí)候就需要借助其他的方法,下面小編就來(lái)和大家講講MyBatis-Plus如何優(yōu)雅處理JSON字段映射吧
    2025-04-04

最新評(píng)論

昭通市| 探索| 新泰市| 峨眉山市| 胶南市| 三明市| 贡嘎县| 临潭县| 镇坪县| 简阳市| 黄陵县| 新龙县| 柘荣县| 寻甸| 赤水市| 昌黎县| 得荣县| 搜索| 永川市| 淮安市| 高陵县| 长丰县| 平南县| 清水河县| 子洲县| 怀宁县| 云龙县| 大石桥市| 丁青县| 金湖县| 大丰市| 柏乡县| 苍山县| 萨迦县| 大足县| 舞钢市| 萨嘎县| 平远县| 丽江市| 泸溪县| 米泉市|