數據結構5(初):續寫排序

目錄

1、外排序

2、計數排序


1、外排序

上一節中提到的排序都可以用來進行內排序,但是只有歸并排序的思想可以用來進行外部排序,因為文件數據是沒辦法像數組那樣進行訪問的。

例如:

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}int GetMidIndex(int* a, int begin, int end)
{int mid = (begin + end) / 2;if (a[begin] < a[mid]){if (a[mid] < a[end])return mid;else if (a[begin] > a[end])return begin;elsereturn end;}else // a[begin] > a[mid]{if (a[mid] > a[end])return mid;else if (a[begin] < a[end])return begin;elsereturn end;}
}void QuickSort(int* a, int left, int right)//快速排序
{assert(a);if (left >= right)return;int midIndex = GetMidIndex(a, left, right);Swap(&a[midIndex], &a[right]);int prev = left - 1;int cur = left;int keyindex = right;while (cur < right){if (a[cur] < a[keyindex] && ++prev != cur)Swap(&a[prev], &a[cur]);++cur;}Swap(&a[++prev], &a[keyindex]);int div = prev;QuickSort(a, left, div - 1);QuickSort(a, div + 1, right);}void _MergeFile(const char* file1, const char* file2, const char* mfile)//對兩個文件進行歸并。
{FILE* fout1 = fopen(file1, "r");//讀文件1。if (fout1 == NULL){printf("打開文件失敗\n");exit(-1);}FILE* fout2 = fopen(file2, "r");//讀文件2。if (fout2 == NULL){printf("打開文件失敗\n");exit(-1);}FILE* fin = fopen(mfile, "w");//寫出歸并文件。if (fin == NULL){printf("打開文件失敗\n");exit(-1);}int num1, num2;int ret1 = fscanf(fout1, "%d\n", &num1);int ret2 = fscanf(fout2, "%d\n", &num2);while (ret1 != EOF && ret2 != EOF){if (num1 < num2){fprintf(fin, "%d\n", num1);ret1 = fscanf(fout1, "%d\n", &num1);}else{fprintf(fin, "%d\n", num2);ret2 = fscanf(fout2, "%d\n", &num2);}}while (ret1 != EOF){fprintf(fin, "%d\n", num1);ret1 = fscanf(fout1, "%d\n", &num1);}while (ret2 != EOF){fprintf(fin, "%d\n", num2);ret2 = fscanf(fout2, "%d\n", &num2);}fclose(fout1);fclose(fout2);fclose(fin);
}void MergeSortFile(const char* file)//待排文件
{FILE* fout = fopen(file, "r");if (fout == NULL){printf("打開待排文件失敗\n");exit(-1);}int n = 10;//每組數據有10個,我們在該測試中,僅僅只測試100個數據的外排序,所以每組分為了10個數據。int a[10];//將num每次讀取的數據放入該數組中。int i = 0;int num = 0;//每次讀取的數據暫時存放在此處。char subfile[20];int filei = 1;memset(a, 0, sizeof(int) * n);//初始化數組awhile (fscanf(fout, "%d\n", &num) != EOF){if (i < n - 1){a[i++] = num;}else{a[i] = num;QuickSort(a, 0, n - 1);//使用快速排序進行內存上的排序。sprintf(subfile, "%d", filei++);FILE* fin = fopen(subfile, "w");if (fin == NULL){printf("打開文件失敗\n");exit(-1);}for (int j = 0; j < n; j++){fprintf(fin, "%d\n", a[j]);}fclose(fin);i = 0;memset(a, 0, sizeof(int) * n);}}// 利用互相歸并到文件,實現整體有序char mfile[100] = "12";//由file1和file2歸并出來的文件char file1[100] = "1";char file2[100] = "2";for (int i = 2; i <= n; ++i){// 讀取file1和file2,進行歸并出mfile_MergeFile(file1, file2, mfile);strcpy(file1, mfile);sprintf(file2, "%d", i + 1);sprintf(mfile, "%s%d", mfile, i + 1);}printf("%s文件排序成功\n", file);fclose(fout);
}int main()
{MergeSortFile("../DataSort.txt");return 0;
}

?對于這個例子,讀者不必要關注這個代碼是不是寫的有點不規范,只需要明白外排序的思想即可。

2、計數排序

思想:計數排序又稱為鴿巢原理,操作步驟:

1. 統計相同元素出現次數。

2. 根據統計的結果進行排序。

例如:

//計數排序
void CountSort(int* a, int n)
{int min = a[0], max = a[0];for (int i = 0; i < n; i++){if (a[i] < min){min = a[i];}if (a[i] > max){max = a[i];}}int range = max - min + 1;int* countA = (int*)malloc(sizeof(int) * range);memset(countA, 0, sizeof(int) * range);//for (int i = 0; i < n; i++){countA[a[i] - min]++;}int k = 0;for (int j = 0; j < range; j++){while (countA[j]--){a[k++] = j + min;}}
}

計數排序的特性總結:

1. 計數排序在數據范圍集中時,效率很高,但是適用范圍及場景有限(僅僅只適用于整數的排序)

2. 時間復雜度:O(N+range)。

3. 空間復雜度:O(range)。

4. 穩定性:穩定

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

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

相關文章

《當人工智能遇上廣域網:跨越地理距離的通信變革》

在數字化時代&#xff0c;廣域網作為連接全球信息的紐帶&#xff0c;讓數據能夠在不同地區的網絡之間流動。然而&#xff0c;地理距離給廣域網數據傳輸帶來諸多挑戰&#xff0c;如高延遲、低帶寬、信號衰減和不穩定等問題。幸運的是&#xff0c;飛速發展的人工智能技術為解決這…

Linux馮諾依曼體系與計算機系統架構認知(8)

文章目錄 前言一、馮諾依曼體系馮?諾依曼體系結構推導內存提高馮?諾依曼體系結構效率的方法你用QQ和朋友聊天時數據的流動過程與馮?諾依曼體系結構相關的一些知識 二、計算機層次結構分析操作系統(Operator System)驅動層的作用與意義系統調用接口(system call)用戶操作接口…

OpenCV的基本用法全解析

《小白入門&#xff1a;OpenCV的基本用法全解析》 嗨&#xff0c;朋友們&#xff01;之前咱們知道了OpenCV在機器視覺里就像個超級厲害的瑞士軍刀&#xff0c;那今天咱們就來好好嘮嘮&#xff0c;**OpenCV到底該怎么用呢&#xff1f;**這就像是拿到了一把好劍&#xff0c;咱們…

匯川EASY系列之以太網通訊(MODBUS_TCP做從站)

匯川easy系列PLC做MODBUS_TCP從站,不需要任何操作,但是有一些需要知道的東西。具體如下: 1、匯川easy系列PLC做MODBUS_TCP從站,,ModbusTCP服務器默認開啟,無需設置通信協議(即不需要配置),端口號為“502”。ModbusTCP從站最多支持31個ModbusTCP客戶端(ModbusTCP主站…

在 Offset Explorer 中配置多節點 Kafka 集群的詳細指南

一、是否需要配置 Zookeeper&#xff1f; Kafka 集群的 Zookeeper 依賴性與版本及運行模式相關&#xff1a; Kafka 版本是否需要 Zookeeper說明0.11.x 及更早版本? 必須配置Kafka 完全依賴 Zookeeper 管理元數據2.8 及以下版本? 必須配置Kafka 依賴外置或內置的 Zookeeper …

前端-選中pdf中的文字并使用,顯示一個懸浮的翻譯按鈕(本地pdfjs+iframe)不適用textlayer

使用pdfjs移步– vue2使用pdfjs-dist實現pdf預覽&#xff08;iframe形式&#xff0c;不修改pdfjs原來的ui和控件&#xff0c;dom層可以用display去掉一部分組件&#xff09; 方案1&#xff1a;獲取選擇文本內容的最前面的字符坐標的位置&#xff08;這種寫法會導致如果選擇超出…

生活電子常識-deepseek-r1本地化部署+ui界面搭建

前言 deepseek-r1 14b模型&#xff0c;32b模型部署在本地電腦上也能實現非常好的性能。 因此有興趣研究了下如何在本地部署。 同時最新流行mauns工作流&#xff0c;他們提供一句話實現網頁端任意應用的能力。實際上&#xff0c;你也可以用本地的模型來實現離線的ai工作流功能。…

mac絲滑安裝Windows操作系統【絲滑簡單免費】

mac絲滑安裝Windows操作系統【絲滑&簡單&免費】 記錄mac絲滑安裝windows系統1、安裝免費版 VMware fusion 132、安裝Windows鏡像文件3、跳過聯網安裝&#xff08;完成1后將2拖入1 點點點 即可來到3的環節&#xff09;4、 安裝vmware 工具【非常重要&#xff0c;涉及聯網…

基于Spring Boot的企業內管信息化系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

Pytorch實現之對稱卷積神經網絡結構實現超分辨率

簡介 簡介:針對傳統的超分辨率重建技術所重建的圖像過于光滑且缺乏細節的問題,作者提出了一種改進的生成對抗圖像超分辨率網絡。 該改進方法基于深度神經網絡,其生成模型包含多層卷積模塊和多層反卷積模塊,其中在感知損失基礎上增加了跳層連接和損失函數。 該判別模型由多…

Scikit-learn模型構建全流程解析:從數據預處理到超參數調優

模型選擇與訓練步驟及示例 1. 數據準備與探索 步驟說明&#xff1a;加載數據并初步探索其分布、缺失值、異常值等。 注意事項&#xff1a; 檢查數據類型&#xff08;數值/類別&#xff09;、缺失值和異常值。對類別型特征進行編碼&#xff08;如獨熱編碼&#xff09;。 實例&…

001-JMeter的安裝與配置

1.前期準備 下載好JMeter : https://jmeter.apache.org/download_jmeter.cgi 下載好JDK : :Java Downloads | Oracle 中國 下載圖中圈藍的JMeter和JDK就行&#xff0c;讓它邊下載&#xff0c;我們邊往下看 2.為什么要下載并安裝JDK ? JMeter 是基于 Java 開發的工具&#…

第2.2節 Android Jacoco插件覆蓋率采集

JaCoCo&#xff08;Java Code Coverage&#xff09;是一款開源的代碼覆蓋率分析工具&#xff0c;適用于Java和Android項目。它通過插樁技術統計測試過程中代碼的執行情況&#xff0c;生成可視化報告&#xff0c;幫助開發者評估測試用例的有效性。在github上開源的項目&#xff…

特征工程自動化(FeatureTools實戰)

目錄 特征工程自動化(FeatureTools實戰)1. 引言2. 項目背景與意義2.1 特征工程的重要性2.2 自動化特征工程的優勢2.3 工業級數據處理需求3. 數據集生成與介紹3.1 數據集構成3.2 數據生成方法4. 自動化特征工程理論基礎4.1 特征工程的基本概念4.2 FeatureTools庫簡介4.3 關鍵公…

Scikit-learn模型評估全流程解析:從數據劃分到交叉驗證優化

模型評估的步驟、scikit-learn函數及實例說明 1. 數據劃分&#xff08;Train-Test Split&#xff09; 函數&#xff1a;train_test_split使用場景&#xff1a;將數據分為訓練集和測試集&#xff0c;避免模型過擬合。作用&#xff1a;確保模型在未見過的數據上驗證性能。示例&…

Spring AI相關的面試題

以下是150道Spring AI相關的面試題目及答案&#xff1a; ### Spring AI基礎概念類 **1. 什么是Spring AI&#xff1f;** Spring AI是Spring框架的擴展&#xff0c;旨在簡化人工智能模型在Java應用中的集成與使用&#xff0c;提供與Spring生態無縫銜接的工具和抽象&#xff0c…

C++ 學習筆記(四)—— 類和對象

1、this指針 class Date { public&#xff1a;void Init(Date* this, int year, int month, int day){this->_year year;this->_month month;this->_day day;this->Print();// 這就是this指針&#xff0c;是編譯器自己加的&#xff0c;是用來讓成員函數找到成…

SpringMVC全局異常處理機制

異常處理機制 異常處理的兩種方式&#xff1a; 編程式異常處理&#xff1a;是指在代碼中顯式地編寫處理異常的邏輯。它通常涉及到對異常類型的檢測及其處理&#xff0c;例如使用 try-catch 塊來捕獲異常&#xff0c;然后在 catch 塊中編寫特定的處理代碼&#xff0c;或者在 f…

深入LangChain:LLM交互機制與RAG集成的技術

本文將聚焦于 LangChain 如何集成檢索增強生成&#xff08;RAG&#xff09;&#xff0c;了解其架構、主要組件&#xff0c;以及與 LLM 的交互 LangChain 架構概覽 1、基礎層 這是與各類 LLM 對接的 “橋梁”。LangChain 支持多種流行的 LLM&#xff0c;如 OpenAI 的系列模型、H…

本地部署 LangManus

本地部署 LangManus 0. 引言1. 部署 LangManus2. 部署 LangManus Web UI 0. 引言 LangManus 是一個社區驅動的 AI 自動化框架&#xff0c;它建立在開源社區的卓越工作基礎之上。我們的目標是將語言模型與專業工具&#xff08;如網絡搜索、爬蟲和 Python 代碼執行&#xff09;相…