快速排序實現的C++函數模板

快速排序(Quicksort)算法是一種常用的基於比較的排序算法,其時間複雜度為O(nlogn)。在該算法中,通過選擇樞紐元素將待排序數組分割成兩個子序列,其中一個子序列的所有元素都小於樞紐元素,另外一個子序列的所有元素都大於等於樞紐元素。然後遞歸的排序這兩個子序列。

下面是快速排序實現的C++函數模板:

template <typename T>
void quick_sort(vector<T>& arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int i = left;
    int j = right;
    T pivot = arr[(left + right) / 2];
    while (i <= j) {
        while (arr[i] < pivot) {
            i++;
        }
        while (arr[j] > pivot) {
            j--;
        }
        if (i <= j) {
            swap(arr[i], arr[j]);
            i++;
            j--;
        }
    }
    quick_sort(arr, left, j);
    quick_sort(arr, i, right);
}

一、快速排序的原理和算法流程

在快速排序算法中,通過選擇一個樞紐元素,將待排序的數組分割成兩個子序列。樞紐元素選取的方式有多種,例如可以選擇第一個元素、最後一個元素或者中間的元素。通常情況下,我們選擇中間的元素作為樞紐元素,因為這樣可以避免最壞時間複雜度的出現。

算法流程如下:

  • 1. 選擇一個樞紐元素pivot,一般取數組中間的元素
  • 2. 將待排序數組分成兩個子序列,一個序列中所有元素都小於pivot,另一個序列中所有元素都大於等於pivot
  • 3. 對這兩個子序列遞歸執行第1步和第2步操作

二、實現細節和優化

快速排序是一種高效的排序算法,但是在實際使用中,存在一些需要注意的實現細節和優化點,下面列舉一些:

  • 1. 在樞紐元素的選擇上,可以採用三數取中的方式,即選擇左、中、右三個元素的中位數作為樞紐元素。這種方式可以避免在排序的過程中出現最壞情況。
  • 2. 在排序前,可以對待排序數組進行一次隨機打亂,這樣可以避免在數組已經有序或者近乎有序的情況下出現最壞情況。
  • 3. 迭代實現快速排序比遞歸實現快速排序更高效,因為在遞歸實現中需要調用函數和壓棧,需要耗費額外的時間和空間。
  • 4. 對於小規模的數組,使用插入排序或者選擇排序可以提高快速排序的效率。
  • 5. 在實際使用中,可以使用STL中的sort函數替代手寫的快速排序,這樣可以避免一些實現細節和錯誤。

三、快速排序的應用場景

快速排序是一種常見的排序算法,廣泛應用於各種軟件系統中,例如:

  • 1. 數據庫系統中對數據進行排序
  • 2. 操作系統中進行進程/線程調度
  • 3. 計算機網絡中對數據進行排序
  • 4. 一些組合優化問題中的求解方法

四、代碼示例

下面是使用上述快速排序函數模板的示例,對一個整數數組進行排序:

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
void quick_sort(vector<T>& arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int i = left;
    int j = right;
    T pivot = arr[(left + right) / 2];
    while (i <= j) {
        while (arr[i] < pivot) {
            i++;
        }
        while (arr[j] > pivot) {
            j--;
        }
        if (i <= j) {
            swap(arr[i], arr[j]);
            i++;
            j--;
        }
    }
    quick_sort(arr, left, j);
    quick_sort(arr, i, right);
}

int main() {
    vector<int> arr = {3, 7, 4, 5, 2, 1, 9, 8, 6};
    quick_sort(arr, 0, arr.size() - 1);
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

原創文章,作者:RGAV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/142751.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RGAV的頭像RGAV
上一篇 2024-10-12 09:45
下一篇 2024-10-12 09:45

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • 心形照片拼圖模板

    如何使用心形照片拼圖模板 一、模板介紹 心形照片拼圖模板是一種讓用戶可以將自己的照片拼接成一個心形的巧妙設計,每個照片都是一個拼圖塊,當所有的照片配合完成時,呈現出一個完整的心形。…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29

發表回復

登錄後才能評論