国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】數(shù)據(jù)結(jié)構(gòu)與算法:常用排序算法

這篇具有很好參考價(jià)值的文章主要介紹了【C++】數(shù)據(jù)結(jié)構(gòu)與算法:常用排序算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??★,°:.☆( ̄▽ ̄)/$:.°★ ??
這篇文章主要介紹常用排序算法。
學(xué)其所用,用其所學(xué)。——梁?jiǎn)⒊?/font>
歡迎來到我的博客,一起學(xué)習(xí),共同進(jìn)步。
喜歡的朋友可以關(guān)注一下,下次更新不迷路??

??1. 算法介紹

排序算法是計(jì)算機(jī)科學(xué)中常見的一類算法,用于將一組數(shù)據(jù)按照特定的順序進(jìn)行排列。下面介紹幾種常見的排序算法:

  1. 冒泡排序(Bubble Sort):
  • 從待排序序列的第一個(gè)元素開始,兩兩比較相鄰元素的大小,如果順序不對(duì)則交換位置。
  • 每一輪結(jié)束后,最大(或最小)的元素會(huì)移動(dòng)到末尾。
  • 時(shí)間復(fù)雜度:平均情況和最壞情況下為 O(n^2),最好情況下為 O(n)。
  • 空間復(fù)雜度:O(1)。
  1. 插入排序(Insertion Sort):
  • 將未排序序列的第一個(gè)元素插入已排序序列的正確位置。
  • 從第二個(gè)元素開始,依次與前面的元素比較并插入到正確位置。
  • 時(shí)間復(fù)雜度:平均情況和最壞情況下為 O(n^2),最好情況下為 O(n)。
  • 空間復(fù)雜度:O(1)。
  1. 選擇排序(Selection Sort):
  • 每一輪從待排序序列中選擇最?。ɑ蜃畲螅┑脑兀c當(dāng)前位置交換。
  • 每一輪結(jié)束后,當(dāng)前位置之前的元素都是有序的。
  • 時(shí)間復(fù)雜度:平均情況和最壞情況下為 O(n^2)。
  • 空間復(fù)雜度:O(1)。
  1. 快速排序(Quick Sort):
  • 選擇一個(gè)基準(zhǔn)元素,將序列分為比基準(zhǔn)小的元素和比基準(zhǔn)大的元素。
  • 遞歸地對(duì)劃分后的子序列進(jìn)行快速排序。
  • 時(shí)間復(fù)雜度:平均情況下為 O(nlogn),最壞情況下為 O(n^2)。
  • 空間復(fù)雜度:平均情況下為 O(logn),最壞情況下為 O(n)。
  1. 歸并排序(Merge Sort):
  • 將序列遞歸地拆分成兩個(gè)子序列,對(duì)子序列進(jìn)行排序,然后合并兩個(gè)有序子序列。
  • 使用分治法思想,將排序問題分解為較小的子問題。
  • 時(shí)間復(fù)雜度:平均情況下為 O(nlogn)。
  • 空間復(fù)雜度:O(n)。

??2. C++實(shí)現(xiàn)

#include <iostream>
#include <cstdlib>
#include <ctime>

// 冒泡排序 bubbleSort 兩兩比較
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < n-i-1; j++) {
            if (arr[j] > arr[j+1]) {
                std::swap(arr[j], arr[j+1]);
            }
        }
    }
}

// 選擇排序 selectionSort 選最小值
void selectionSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        int minIndex = i;

        for (int j = i+1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }

        std::swap(arr[i], arr[minIndex]);
    }
}

// 插入排序 insertionSort 依次成序
void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;

        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }

        arr[j + 1] = key;
    }
}

// 歸并排序 mergeSort
void merge(int arr[], int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;

    int* L = new int[n1];
    int* R = new int[n2];

    for (int i = 0; i < n1; i++) {
        L[i] = arr[left + i];
    }
    for (int j = 0; j < n2; j++) {
        R[j] = arr[mid + 1 + j];
    }

    int i = 0;
    int j = 0;
    int k = left;

    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }

    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }

    delete[] L;
    delete[] R;
}

void mergeSort(int arr[], int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;

        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);

        merge(arr, left, mid, right);
    }
}

// 快速排序 quickSort
int partition(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = low - 1;

    for (int j = low; j < high; j++) {
        if (arr[j] <= pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }

    std::swap(arr[i+1], arr[high]);

    return i+1;
}

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);

        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

// 打印數(shù)組
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
}

int main() {
    const int SIZE = 10;

    // 生成隨機(jī)整數(shù)數(shù)組
    int arr[SIZE];
    srand(time(0));
    for (int i = 0; i < SIZE; i++) {
        arr[i] = rand() % 100; // 生成 0 到 99 的隨機(jī)數(shù)
    }

    std::cout << "Original array: ";
    printArray(arr, SIZE);

    // 使用冒泡排序進(jìn)行排序
    bubbleSort(arr, SIZE);
    std::cout << "Array after bubble sort: ";
    printArray(arr, SIZE);

    // 使用選擇排序進(jìn)行排序
    selectionSort(arr, SIZE);
    std::cout << "Array after selection sort: ";
    printArray(arr, SIZE);

    // 使用插入排序進(jìn)行排序
    insertionSort(arr, SIZE);
    std::cout << "Array after insertion sort: ";
    printArray(arr, SIZE);

    // 使用歸并排序進(jìn)行排序
    mergeSort(arr, 0, SIZE-1);
    std::cout << "Array after merge sort: ";
    printArray(arr, SIZE);

    // 使用快速排序進(jìn)行排序
    quickSort(arr, 0, SIZE-1);
    std::cout << "Array after quick sort: ";
    printArray(arr, SIZE);

    return 0;
}

編譯運(yùn)行:

g++ -o main main.cpp && ./main

【C++】數(shù)據(jù)結(jié)構(gòu)與算法:常用排序算法,# c++數(shù)據(jù)結(jié)構(gòu)與算法,排序算法,c++,算法

以上。文章來源地址http://www.zghlxwxcb.cn/news/detail-626120.html

到了這里,關(guān)于【C++】數(shù)據(jù)結(jié)構(gòu)與算法:常用排序算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)和常用排序算法復(fù)雜度

    數(shù)據(jù)結(jié)構(gòu)和常用排序算法復(fù)雜度

    插入操作時(shí)間復(fù)雜度 最好O(1),最壞O(n),平均O(n) 移動(dòng)結(jié)點(diǎn)的平均次數(shù)n/2 刪除操作時(shí)間復(fù)雜度 最好O(1),最壞O(n),平均O(n) 移動(dòng)結(jié)點(diǎn)的平均次數(shù)(n-1)/2 按值查找時(shí)間復(fù)雜度 最好O(1),最壞O(n),平均O(n) 移動(dòng)結(jié)點(diǎn)的平均次數(shù)(n+1)/2 頭插法O(n) 尾插法O(n) 按序查找O(n) 按值查找O(n) 插入

    2024年02月11日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)第四次實(shí)驗(yàn)-常用的內(nèi)部排序算法

    數(shù)據(jù)結(jié)構(gòu)第四次實(shí)驗(yàn)-常用的內(nèi)部排序算法

    一、實(shí)驗(yàn)?zāi)康?1.掌握常見的內(nèi)部排序算法的思想及其適用條件; 2.掌握常見的內(nèi)部排序算法的程序?qū)崿F(xiàn); 二、實(shí)驗(yàn)內(nèi)容及要求 1、任務(wù)描述 設(shè)計(jì)一個(gè)內(nèi)部排序算法模擬系統(tǒng),利用該系統(tǒng)實(shí)現(xiàn)常用的 7 種排序算法,并測(cè)試 各種排序算法的性能。 ?實(shí)驗(yàn)內(nèi)容:通過一個(gè)簡(jiǎn)單的菜

    2024年02月07日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉排序樹(c風(fēng)格、結(jié)合c++引用)

    【數(shù)據(jù)結(jié)構(gòu)】二叉排序樹(c風(fēng)格、結(jié)合c++引用)

    目錄 1 基本概念 結(jié)構(gòu)體定義 各種接口 2?二叉排序樹的構(gòu)建和中序遍歷 遞歸版單次插入 非遞歸版單次插入 3?二叉排序樹的查找 非遞歸版本 遞歸版本 4?二叉排序樹的刪除(難點(diǎn)) ????????普通二叉排序樹是一種簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),節(jié)點(diǎn)的值根據(jù)特定順序(通常是升序或降

    2024年02月05日
    瀏覽(12)
  • 數(shù)據(jù)結(jié)構(gòu)07:查找[C++][樸素二叉排序樹BST]

    數(shù)據(jù)結(jié)構(gòu)07:查找[C++][樸素二叉排序樹BST]

    圖源:文心一言 考研筆記整理 8k+ 字,小白友好、代碼可跑,請(qǐng)小伙伴放心食用~~???? 第1版:查資料、寫B(tài)UG、畫導(dǎo)圖、畫配圖~???? 參考用書: 王道考研《2024年 數(shù)據(jù)結(jié)構(gòu)考研復(fù)習(xí)指導(dǎo)》 參考用書配套視頻: 7.3_1 二叉排序樹_嗶哩嗶哩_bilibili 特別感謝: ?Chat GPT老師、文心

    2024年02月10日
    瀏覽(16)
  • 數(shù)據(jù)結(jié)構(gòu)07:查找[C++][平衡二叉排序樹AVL]

    數(shù)據(jù)結(jié)構(gòu)07:查找[C++][平衡二叉排序樹AVL]

    圖源:文心一言 考研筆記整理1w+字,小白友好、代碼可跑,請(qǐng)小伙伴放心食用~~???? 第1版:查資料、寫B(tài)UG、畫導(dǎo)圖、畫配圖~???? 參考用書: 王道考研《2024年 數(shù)據(jù)結(jié)構(gòu)考研復(fù)習(xí)指導(dǎo)》 參考用書配套視頻: 7.3_2 平衡二叉樹_嗶哩嗶哩_bilibili 特別感謝: ?Chat GPT老師、文心

    2024年02月11日
    瀏覽(46)
  • C++數(shù)據(jù)結(jié)構(gòu)與算法——哈希表

    C++數(shù)據(jù)結(jié)構(gòu)與算法——哈希表

    C++第二階段——數(shù)據(jù)結(jié)構(gòu)和算法,之前學(xué)過一點(diǎn)點(diǎn)數(shù)據(jù)結(jié)構(gòu),當(dāng)時(shí)是基于Python來學(xué)習(xí)的,現(xiàn)在基于C++查漏補(bǔ)缺,尤其是樹的部分。這一部分計(jì)劃一個(gè)月,主要利用代碼隨想錄來學(xué)習(xí),刷題使用力扣網(wǎng)站,不定時(shí)更新,歡迎關(guān)注! 給定兩個(gè)字符串 s 和 t ,編寫一個(gè)函數(shù)來判斷

    2024年02月19日
    瀏覽(38)
  • 鏈表綜合算法設(shè)計(jì)(c++數(shù)據(jù)結(jié)構(gòu))

    ? 一、設(shè)計(jì)內(nèi)容 已知簡(jiǎn)單的人事信息系統(tǒng)中職工記錄包含職工編號(hào)(no)、職工姓名(name)、部門名稱(depname)、職稱(title)和工資數(shù)(salary)等信息(可以增加其他信息),設(shè)計(jì)并完成一個(gè)簡(jiǎn)單的人事信息管理系統(tǒng),要求完成但不限于以下功能: (1)?? ?增加一個(gè)職工信息

    2024年02月02日
    瀏覽(33)
  • C++數(shù)據(jù)結(jié)構(gòu)與算法——棧與隊(duì)列

    C++數(shù)據(jù)結(jié)構(gòu)與算法——棧與隊(duì)列

    C++第二階段——數(shù)據(jù)結(jié)構(gòu)和算法,之前學(xué)過一點(diǎn)點(diǎn)數(shù)據(jù)結(jié)構(gòu),當(dāng)時(shí)是基于Python來學(xué)習(xí)的,現(xiàn)在基于C++查漏補(bǔ)缺,尤其是樹的部分。這一部分計(jì)劃一個(gè)月,主要利用代碼隨想錄來學(xué)習(xí),刷題使用力扣網(wǎng)站,不定時(shí)更新,歡迎關(guān)注! 請(qǐng)你僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)

    2024年02月20日
    瀏覽(24)
  • C++數(shù)據(jù)結(jié)構(gòu)與算法——雙指針法

    C++數(shù)據(jù)結(jié)構(gòu)與算法——雙指針法

    C++第二階段——數(shù)據(jù)結(jié)構(gòu)和算法,之前學(xué)過一點(diǎn)點(diǎn)數(shù)據(jù)結(jié)構(gòu),當(dāng)時(shí)是基于Python來學(xué)習(xí)的,現(xiàn)在基于C++查漏補(bǔ)缺,尤其是樹的部分。這一部分計(jì)劃一個(gè)月,主要利用代碼隨想錄來學(xué)習(xí),刷題使用力扣網(wǎng)站,不定時(shí)更新,歡迎關(guān)注! 給你一個(gè)數(shù)組 nums 和一個(gè)值 val,你需要 原地

    2024年02月20日
    瀏覽(18)
  • C++中的算法與數(shù)據(jù)結(jié)構(gòu)優(yōu)化技巧

    在C++編程中,算法和數(shù)據(jù)結(jié)構(gòu)的優(yōu)化是提高程序性能和效率的關(guān)鍵因素之一。下面是一些常見的算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化技巧,希望對(duì)您有幫助: 選擇合適的數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)結(jié)構(gòu)的選擇對(duì)算法效率有重要影響。根據(jù)具體問題的需求,選擇合適的數(shù)據(jù)結(jié)構(gòu),如數(shù)組、鏈表、樹、散列

    2024年01月17日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包