南京師范大學計電院數據結構課設——排序算法

1?排序算法

1.1 題目要求

編程實現希爾、快速、堆排序、歸并排序算法。要求首先隨機產生10000個數據存入磁盤文件,然后讀入數據文件,分別采用不同的排序方法進行排序并將結果存入文件中。

1.2 算法思想描述

1.2.1?隨機數生成

當需要生成一系列隨機數時,常常需要使用隨機函數。然而,傳統的rand()函數所生成的數據并不能被視為真正的隨機數,因其僅限于某個特定范圍內的值,并且在多次運行同一rand()函數時,所產生的隨機數序列是完全一致的,缺乏真正的隨機性。為此,我們需要借助srand()函數來設置rand()函數生成隨機數時的種子值,通過不同的種子值,我們可以獲得不同的隨機數序列。

為了實現更接近真正隨機數的序列生成,一種常見的做法是利用srand((int)time(NULL))的方式,即利用系統時鐘來產生隨機數種子。該方法將當前時間轉換為一個整數,并將其作為srand()函數的參數,以初始化隨機數生成器的種子值。由于時間的變化是無法預測的,因此每次程序運行時都會獲得一個不同的種子值,從而產生不同的隨機數序列。

圖1.1 隨機生成數示例代碼

1.2.2?希爾排序

希爾排序(Shell Sort)是一種基于插入排序的排序算法,它通過將待排序的元素按照一定的間隔分組,對每組進行插入排序,隨著間隔逐漸減小,最終使得整個序列達到有序狀態。

下面是希爾排序的基本思想和實現步驟:

  1. 選擇一個間隔序列(稱為增量序列),通常初始間隔為數組長度的一半,然后逐步縮小間隔直到為1。
  2. 對于每個間隔,將數組分成多個子序列,子序列的元素之間相隔間隔個位置。
  3. 對每個子序列進行插入排序,即將子序列中的元素按照插入排序的方式進行排序。
  4. 重復步驟2和步驟3,直到間隔為1時,進行最后一次插入排序。

圖1.2 希爾排序示例代碼

1.2.3?快速排序

快速排序(Quick Sort)是一種高效的排序算法,它采用分治法(Divide and Conquer)策略來排序一個數組。快速排序的基本思想是選擇一個基準元素(pivot),將數組分割成兩個子數組,其中一個子數組的元素都比基準元素小,另一個子數組的元素都比基準元素大,然后對這兩個子數組分別進行遞歸排序,最終將整個數組排序完成。

圖1.3 快速排序示例代碼

1.2.4?堆排序

堆排序(Heap Sort)是一種利用堆數據結構進行排序的算法。堆是一種完全二叉樹,具有以下性質:對于每個節點i,其父節點的值小于等于節點i的值(最大堆),或者父節點的值大于等于節點i的值(最小堆)。在堆排序中,我們使用最大堆來進行排序。

下面是堆排序的基本思想和實現步驟:

  1. 把無序數組構建成二叉堆。
  2. 循環刪除堆頂元素,移到集合尾部,調節堆產生新的堆頂。
  3. 當刪除一個最大堆的堆頂(并不是完全刪除,而是替換到最后面),經過自我調節,第二大的元素就會被交換上來,成為最大堆的新堆頂。由于這個特性,我們每一次刪除舊堆頂,調整后的新堆頂都是大小僅次于舊堆頂的節點。那么我們只要反復刪除堆頂,反復調節二叉堆,所得到的集合就成為了一個有序集合。

圖1.4 堆排序示例代碼

1.2.5?歸并排序

歸并排序(Merge Sort)是一種基于分治法(Divide and Conquer)的排序算法,它將待排序的數組逐步分割成較小的子數組,然后將這些子數組逐個合并,最終得到一個有序的數組。合并2個數組的稱為2路歸并,合并3個數組的稱為3路歸并,多路歸并。歸并排序是穩定的。

圖1.5 歸并排序示例代碼

1.3?程序設計

1.3.1 程序設計思路

圖1.6 程序設計思路圖

1.3.2?生成input.txt文件

先創建一個文件并打開,然后生成隨機數存儲到該文件中作為后續的輸入文件。

圖1.7 生成input.txt文件代碼

1.3.3?生成排序結果文件

首先完成文件的存入函數,再分別調用不同的排序算法完成排序再存入對應的文件中。

圖1.8將數據存入文件代碼

圖1.9 排序并存入文件代碼

1.3.4完整代碼(C++)

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>// 生成隨機數并保存到文件
void generateRandomNumbers(const std::string& filename, int count) {std::ofstream file(filename);if (!file.is_open()) {std::cout << "無法打開文件:" << filename << std::endl;return;}else{std::cout << "生成成功"<<std::endl;}srand(time(NULL));for (int i = 0; i < count; ++i) {int num = rand() % 100000;  // 生成0到99999之間的隨機數file << num << std::endl;}file.close();
}// 從文件中讀取數據
std::vector<int> readNumbersFromFile(const std::string& filename) {std::vector<int> numbers;std::ifstream file(filename);if (!file.is_open()) {std::cout << "無法打開文件:" << filename << std::endl;return numbers;}int num;while (file >> num) {numbers.push_back(num);}file.close();return numbers;
}// 將數據存入文件
void writeNumbersToFile(const std::string& filename, const std::vector<int>& numbers) {std::ofstream file(filename);if (!file.is_open()) {std::cout << "無法打開文件:" << filename << std::endl;return;}else{std::cout << "存入成功"<<std::endl;}for (int num : numbers) {file << num << std::endl;}file.close();
}// 希爾排序
void shellSort(std::vector<int>& numbers) {int n = numbers.size();for (int gap = n / 2; gap > 0; gap /= 2) {for (int i = gap; i < n; ++i) {int temp = numbers[i];int j = i;while (j >= gap && numbers[j - gap] > temp) {numbers[j] = numbers[j - gap];j -= gap;}numbers[j] = temp;}}
}// 快速排序
void quickSort(std::vector<int>& numbers, int low, int high) {if (low < high) {int pivot = numbers[high];int i = low - 1;for (int j = low; j <= high - 1; ++j) {if (numbers[j] < pivot) {++i;std::swap(numbers[i], numbers[j]);}}std::swap(numbers[i + 1], numbers[high]);int partitionIndex = i + 1;quickSort(numbers, low, partitionIndex - 1);quickSort(numbers, partitionIndex + 1, high);}
}// 堆排序
void heapify(std::vector<int>& numbers, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && numbers[left] > numbers[largest])largest = left;if (right < n && numbers[right] > numbers[largest])largest = right;if (largest != i) {std::swap(numbers[i], numbers[largest]);heapify(numbers, n, largest);}
}void heapSort(std::vector<int>& numbers) {int n = numbers.size();for (int i = n / 2 - 1; i >= 0; --i)heapify(numbers, n, i);for (int i = n - 1; i >= 0; --i) {std::swap(numbers[0], numbers[i]);heapify(numbers, i, 0);}
}// 歸并排序
void merge(std::vector<int>& numbers, int left, int middle, int right) {int n1 = middle - left + 1;int n2 = right - middle;std::vector<int> leftArr(n1);std::vector<int> rightArr(n2);for (int i = 0; i < n1; ++i)leftArr[i] = numbers[left + i];for (int j = 0; j < n2; ++j)rightArr[j] = numbers[middle + 1 + j];int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (leftArr[i] <= rightArr[j]) {numbers[k] = leftArr[i];++i;}else {numbers[k] = rightArr[j];++j;}++k;}while (i < n1) {numbers[k] = leftArr[i];++i;++k;}while (j < n2) {numbers[k] = rightArr[j];++j;++k;}
}void mergeSort(std::vector<int>& numbers, int left, int right) {if (left < right) {int middle = left + (right - left) / 2;mergeSort(numbers, left, middle);mergeSort(numbers, middle + 1, right);merge(numbers, left, middle, right);}
}int main() {// 生成隨機數并保存到文件generateRandomNumbers("input.txt", 10000);// 從文件中讀取數據std::vector<int> numbers = readNumbersFromFile("input.txt");// 復制數據用于各種排序算法std::vector<int> numbersShell = numbers;std::vector<int> numbersQuick = numbers;std::vector<int> numbersHeap = numbers;std::vector<int> numbersMerge = numbers;// 希爾排序shellSort(numbersShell);// 將結果存入文件writeNumbersToFile("shell_sorted.txt", numbersShell);// 快速排序quickSort(numbersQuick, 0, numbersQuick.size() - 1);// 將結果存入文件writeNumbersToFile("quick_sorted.txt", numbersQuick);// 堆排序heapSort(numbersHeap);// 將結果存入文件writeNumbersToFile("heap_sorted.txt", numbersHeap);// 歸并排序mergeSort(numbersMerge, 0, numbersMerge.size() - 1);// 將結果存入文件writeNumbersToFile("merge_sorted.txt", numbersMerge);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714645.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714645.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714645.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows 11 前后端項目部署

目錄 1.準備環境&#xff1a; 2.安裝jdk 測試&#xff1a;winr 輸入cmd 3.安裝tomcat 4.安裝mysql 遠程導入數據&#xff1a; 外部后臺訪問&#xff1a;192.168.232.1:8080/crm/sys/loginAction.action?usernamezs&password123 5.安裝nginx 前后端部署&#xff1…

qsort函數的模擬實現(冒泡排序模擬)

冒泡排序&#xff1a; 從第一個元素開始&#xff0c;依次比較相鄰的兩個元素&#xff0c;如果順序不對就交換它們。 經過一輪遍歷后&#xff0c;最大&#xff08;或最小&#xff09;的元素會排在最后。 重復進行上述步驟&#xff0c;直到沒有任何元素需要交換&#xff0c;即…

Linux了解

簡介 Linux是一種自由和開放源代碼的類UNIX操作系統&#xff0c;由芬蘭的Linus Torvalds于1991年首次發布。Linux最初是作為支持英特爾x86架構的個人電腦的一個自由操作系統&#xff0c;現在已經被移植到更多的計算機硬件平臺&#xff0c;如手機、平板電腦、路由器、視頻游戲控…

爬蟲入門到精通_實戰篇8(分析Ajax請求并抓取今日頭條美食美圖)_界面上抓取Ajax方式

1 目標 目標&#xff1a; 抓取今日頭條美食美圖&#xff0c;如下&#xff1a; 一些網頁直接請求得到的HTML代碼并沒有在網頁中看到的內容&#xff0c;因為一些信息是通過Ajax加載&#xff0c;并通過js渲染生成的&#xff0c;這時就需要通過分析網頁的請求來獲取想要爬取的內容…

解決conda環境下import TensorFlow失敗的問題

問題描述 安裝了anaconda的電腦&#xff0c;新建了一個名叫deeplearning的環境&#xff0c;在該環境下已經成功安裝了tensorflow。 于是在終端打開python并執行代碼 import tensorflow as tf print(1)除了提示 2024-02-27 21:50:00.801427: I external/local_tsl/tsl/cuda/c…

CSS 盒子模型(box model)

概念 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"這一術語是用來設計和布局時使用CSS盒模型本質上是一個盒子&#xff0c;封裝周圍的HTML元素&#xff0c;它包括&#xff1a;外邊距(margin)&#xff0c;邊框(border)&#xff0c;內邊距(pad…

關于 HTTP 協議,你了解多少

HTTP協議 FastAPI 是建立在 HTTP 協議之上&#xff0c;所以為了更好的掌握 FastAPI。我們需要先簡單的了解一下 HTTP協議 簡介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;遵循經典的客戶端-服務器模型&#xff0c;客戶端打開連接以發出請求&#xff0c;然后等…

【Go語言】Go語言中的流程控制

Go語言中的流程控制 流程控制主要用于設定計算執行的順序&#xff0c;簡歷程序的邏輯結果&#xff0c;Go語言的流程控制語句與其他語言類似&#xff0c;支持如下幾種流程控制語句&#xff1a; 條件語句&#xff1a;用于條件判斷&#xff0c;對應的關鍵字有if、else和else if&a…

SQL 語句的執行順序

數據庫引擎在執行SQL語句并不是從SELECT開始執行&#xff0c;而是從FROM開始&#xff0c;執行順序如下(關鍵字前面的數字代表SQL執行的順序步驟)&#xff1a; ⑧SELECT ⑨DISTINCT ⑩①【Top Num】 【select list】 ①FROM {left_table_name} ③【join_type】 JOIN {righ…

vuecli配置sass

vuecli5如何配置sass sass有很多優勢&#xff0c;可以減少css重復&#xff0c;提高效率等&#xff0c;本人使用了 vuecli5 node -v 查看node版本根據版本安裝node-sass sass-loader 如我的版本“node-sass”: “^4.14.1”,“sass-loader”: “^7.1.0”,node -vv14.15.0&#…

使用 Docker 部署 Fiora 在線聊天室平臺

一、Fiora 介紹 Fiora 簡介 Fiora 是一款開源免費的在線聊天系統。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注冊賬號并登錄&#xff0c;可以長久保存你的數據加入現有群組或者創建自己的群組&#xff0c;來和大家交流和任意人私聊&#xff0c;并添…

MySQL 主從讀寫分離入門——基本原理以及ProxySQL的簡單使用

一、讀寫分離工作原理 讀寫分離的工作原理&#xff1a;在大型網站業務中&#xff0c;當單臺數據庫無法滿足并發需求時&#xff0c;通過主從同步方式同步數據。設置一臺主服務器負責增、刪、改&#xff0c;多臺從服務器負責查詢&#xff0c;從服務器從主服務器同步數據以保持一…

C語言數據結構——隊列

目錄 0.前言 1.隊列的基本概念 2.隊列的實現 2.1實現方式 2.2具體實現 3.隊列的應用場景 4.一道隊列的算法題&#xff08;LeetCode225. 用隊列實現棧&#xff09; 5.結語 &#xff08;圖像由AI生成&#xff09; 0.前言 在計算機科學領域&#xff0c;數據結構是組織和…

Linux篇: 進程控制

一、進程創建 1.1 fork函數初識 在Linux中&#xff0c;fork函數是非常重要的函數&#xff0c;它從已存在進程中創建一個新進程。新進程為子進程&#xff0c;而原進程為父進程。 返回值&#xff1a; 在子進程中返回0&#xff0c;父進程中返回子進程的PID&#xff0c;子進程創…

OSI七層模型/TCP四層模型

協議&#xff1a; 協議是雙方共同指定的一組規則&#xff0c;在網絡通信中表示通信雙方傳遞數據和解釋數據的一組規則。 從A上傳文件到服務器B,需要在A和B之間制定一個雙方都認可的規則&#xff0c;這個規則就叫文件傳輸協議&#xff0c;該協議是ftp協議的一個初級版本&#…

LeetCode 刷題 [C++] 第226題.翻轉二叉樹

題目描述 給你一棵二叉樹的根節點 root &#xff0c;翻轉這棵二叉樹&#xff0c;并返回其根節點。 題目分析 深度優先搜索&#xff08;DFS&#xff09;- 遞歸方式 對于二叉樹的鏡像問題&#xff0c;很容易想到的就是使用遞歸來解決&#xff0c;自底向上依次翻轉每一個節點…

2024年騰訊云優惠券領取頁面_代金券使用方法_新老用戶均可

騰訊云代金券領取渠道有哪些&#xff1f;騰訊云官網可以領取、官方媒體賬號可以領取代金券、完成任務可以領取代金券&#xff0c;大家也可以在騰訊云百科蹲守代金券&#xff0c;因為騰訊云代金券領取渠道比較分散&#xff0c;騰訊云百科txybk.com專注匯總優惠代金券領取頁面&am…

『大模型筆記』Sora:探索大型視覺模型的前世今生、技術內核及未來趨勢

Sora:探索大型視覺模型的前世今生、技術內核及未來趨勢 文章目錄 一. 摘要二. 引言楊立昆推薦的關于世界模型的真正含義(或應該是什么)的好文章。原文:Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models譯文:Sora探索大型…

百度SEO快排原理是什么?如何快速排名方法?

前言&#xff1a;我之前說過我不打算寫這個快速排序。 首先&#xff0c;我從來沒有在自己的網站上操作過所謂的快速排序。 其次&#xff0c;我不能像網上很多人寫的那樣透露百度快速排序的秘密&#xff08;說實話&#xff0c;你可以透露秘密&#xff09;。 方法是有了&#xff…

Linux系統運維腳本:編寫bash腳本程序監控服務器的磁盤空間,在磁盤使用率超過閾值時發送警告郵件

目 錄 一、要求 二、解決方案 &#xff08;一&#xff09;解決思路 &#xff08;二&#xff09;方案 三、腳本程序實現 &#xff08;一&#xff09;腳本代碼和解釋 1、腳本代碼 2、代碼解釋 &#xff08;二&#xff09;腳本驗證 1、腳本編輯 2、給予執…