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

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

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

快速排序(簡稱快排)因為其效率較高(平均O(nlogn))經(jīng)常在筆試題中對其考查。

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

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

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

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

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

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

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

這樣就達到了基數(shù)6左邊的數(shù)字均小于它,右邊的數(shù)字均大于它,再利用遞歸對其左右數(shù)組進行同樣的步驟選取基數(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ù)組第一個元素索引
   * @param right 數(shù)組最后一個元素索引
   * @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)

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

相關(guān)文章

  • Spring?AOP利用切面實現(xiàn)日志保存的示例詳解

    Spring?AOP利用切面實現(xiàn)日志保存的示例詳解

    最近領(lǐng)導(dǎo)讓寫個用切面實現(xiàn)日志保存,經(jīng)過調(diào)研和親測,以完美解決。在這里分享給大家,給有需要的碼友直接使用,希望對大家有所幫助
    2022-11-11
  • java中static關(guān)鍵字用法詳解

    java中static關(guān)鍵字用法詳解

    這篇文章主要為大家詳細介紹了java中static關(guān)鍵字的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java序列化與反序列化的實例分析講解

    Java序列化與反序列化的實例分析講解

    今天小編就為大家分享一篇關(guān)于Java序列化與反序列化的實例分析講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Autowired的注入過程源碼解析

    Autowired的注入過程源碼解析

    這篇文章主要為大家介紹了Autowired的注入過程源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 手把手帶你實現(xiàn)一個萌芽版的Spring容器

    手把手帶你實現(xiàn)一個萌芽版的Spring容器

    大家好,我是老三,Spring是我們最常用的開源框架,經(jīng)過多年發(fā)展,Spring已經(jīng)發(fā)展成枝繁葉茂的大樹,讓我們難以窺其全貌,這節(jié),我們回歸Spring的本質(zhì),五分鐘手擼一個Spring容器,揭開Spring神秘的面紗
    2022-03-03
  • Java guava monitor監(jiān)視器線程的使用詳解

    Java guava monitor監(jiān)視器線程的使用詳解

    工作中的場景中是否存在類似這樣的場景,需要提交的線程在某個觸發(fā)條件下執(zhí)行。本文主要就是使用guava中的monitor來優(yōu)雅的實現(xiàn)帶監(jiān)視器的線程
    2021-11-11
  • 淺談JavaIO之try with底層原理

    淺談JavaIO之try with底層原理

    眾所周知,所有被打開的系統(tǒng)資源,比如流、文件或者Socket連接等,都需要被開發(fā)者手動關(guān)閉,否則隨著程序的不斷運行,資源泄露將會累積成重大的生產(chǎn)事故。本文將介紹JavaIO之try with底層原理。
    2021-06-06
  • 23種設(shè)計模式(3) java原型模式

    23種設(shè)計模式(3) java原型模式

    這篇文章主要為大家詳細介紹了23種設(shè)計模式之java原型模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Spring?Security權(quán)限注解啟動及邏輯處理使用示例

    Spring?Security權(quán)限注解啟動及邏輯處理使用示例

    這篇文章主要為大家介紹了Spring?Security權(quán)限注解啟動及邏輯處理使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • mybatis如何設(shè)置useGeneratedKeys=true

    mybatis如何設(shè)置useGeneratedKeys=true

    這篇文章主要介紹了mybatis如何設(shè)置useGeneratedKeys=true,具有很好的參考價值,希望對大家有所幫助。
    2022-01-01

最新評論