【數據結構算法】快排/歸并/堆排序 c++

一個用來了解數據結構算法(各種排序,列表,樹等)很友好的網站:
https://visualgo.net/en

該題目來自于牛客:算法篇-排序問題

快排(必備)+歸并(體會分治)+堆(自己建堆)

//快速排序 關鍵在于 partition函數,可以自己參考一個模板,我這個參考大話數據結構class Solution {
public:/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可* 將給定數組排序* @param arr int整型vector 待排序的數組* @return int整型vector*///1.快速排序vector<int> MySort(vector<int>& arr) {// write code hereint left=0;int right=arr.size()-1;QuickSort(arr,left,right);return arr;}int QuickTemp(vector<int>& arr,int left,int right){        int i = left;int j = right;int temp = arr[left];while(i<j){while(temp<=arr[j]&&i<j) --j;arr[i]=arr[j];while(temp>=arr[i]&&i<j) ++i;arr[j]=arr[i];}arr[i] = temp;return i;}void QuickSort(vector<int>& arr,int left,int right){if(left<right){int mid=QuickTemp(arr,left,right);QuickSort(arr, left,mid-1);QuickSort(arr, mid+1, right);}}
};//歸并排序 關鍵在于構造一個數組 然后merge,所以這個 merge函數是關鍵
class Solution {
public://歸并排序vector<int> MySort(vector<int>& arr) {MySortCore(arr,0,arr.size()-1);return arr;}void MySortCore(vector<int>&arr,int start,int end){if(start>=end) return;int middle=start+((end-start)>>1);MySortCore(arr,start,middle);MySortCore(arr,middle+1,end);Merge(arr,start,middle,end);}void Merge(vector<int>&arr,int start,int middle,int end){int* tmp=new int[end-start+1];int left=start;int right=middle+1;int pTmp=0;    //輔助數組指針while(left<=middle && right<=end){if(arr[left]<arr[right])tmp[pTmp++]=arr[left++];elsetmp[pTmp++]=arr[right++];}while(left<=middle)tmp[pTmp++]=arr[left++];while(right<=end)tmp[pTmp++]=arr[right++];//排序完數組拷貝回原數組for(int i=0;i<end-start+1;i++)arr[start+i]=tmp[i];}
};
//堆排序,分為兩步,建堆+排序
//一些細節可以參考大話數據結構
//我這個堆是從下標為0開始的,所以左子節點 left=2*root+1, right=2*root+1class Solution {
public://堆排序void Swap(int&a,int &b){int tmp=a;a=b;b=tmp;}void HeapAdjust(vector<int>&arr,int root,int len){int tmp=arr[root];for(int j=2*root+1;j<len;j=2*j+1){if(j<len-1 && arr[j]<arr[j+1])++j;if(tmp>arr[j])break;arr[root]=arr[j];root=j;}arr[root]=tmp;}vector<int> MySort(vector<int>& arr) {for(int i=arr.size()/2-1;i>=0;i--)HeapAdjust(arr,i,arr.size());for(int i=arr.size()-1;i>0;i--){Swap(arr[0],arr[i]);HeapAdjust(arr,0,i);}return arr;}
};

小結:
在做快排序的時候,出現了超時問題,解決辦法:
1、邏輯調整
2、把i++/j–,替換成++i/–j。
3、使用遞歸前的函數傳參最好不是計算式。


以下是其他友友的代碼和注釋(寫的很認真就貼了過來):

class Solution {
public:/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可* 將給定數組排序* @param arr int整型vector 待排序的數組* @return int整型vector*/vector<int> MySort(vector<int>& arr) {// write code heremySort1(arr);return arr;}// 1、快速排序(通過)// 時間復雜度O(logn)。空間復雜度是O(n)。// 主要是要找出標桿值(中間值),默認最后一個值為標桿值,然后比它小的放左邊,比他大的放右邊,然后交換最后一位。就得到標桿值在中間的下標。
// 樹,從上往下排序// 不穩定算法void mySort1(vector<int>& arr) {quicksort(arr, 0, arr.size()-1);}  void quicksort(vector<int> &arr, int left, int right) {if (left > right) return;int pivotIndex = partition(arr, left, right); // 標桿值所在的位置quicksort(arr, left, pivotIndex-1); // 左半邊quicksort(arr, pivotIndex+1, right); // 右半邊}int partition(vector<int> &arr, int left, int right) {// 最后一個值當做標桿int counter = left;      // 記錄小于標桿值的個數while (left < right) {if (arr[left] < arr[right]) { // 當前值和標桿值比較,決定是放在左邊還是右邊swap(arr[left], arr[counter]);counter++;}left++;}swap(arr[counter], arr[right]);   // 最后把標桿值移到中間位置,然后返回下標。return counter;}// 2、歸并排序(通過)// 時間復雜度O(logn)。空間復雜度是O(n)。// 歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。// 樹,從下往上排序// 是穩定的算法void mySort2(vector<int>& arr) {mergeSort(arr, 0, arr.size()-1);}  void mergeSort(vector<int> &arr, int left, int right) {if (left >= right) return;int mid = left + (right - left) / 2;mergeSort(arr, left, mid); // 遞歸 左半邊mergeSort(arr, mid+1, right); // 遞歸 右半邊merge(arr, left, mid, right); // 合并兩個有序的數組(參考合并兩個有序的鏈表)}// 合并兩個有序數組void merge(vector<int> &arr, int left, int mid, int right) {vector<int> tmp(right-left+1); // 開辟新的數組int i = left, j = mid+1, k = 0; // i左邊數組的起始位置,j右邊數組的起始位置,k已經放入新數組的個數while (i <= mid && j <= right) {  // 比較左右數組,數值小的放入新數組中tmp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];}while (i <= mid) tmp[k++] = arr[i++];  // 如果左半邊數組沒有排序完,加入新數組while (j <= right) tmp[k++] = arr[j++]; // 如果右半邊數組沒有排序完,加入新數組for (i = left, k = 0; i <= right;) arr[i++] = tmp[k++]; // 新數組數據放回到原來的數組中}// 3、堆排序(通過)// 時間復雜度O(logn)。空間復雜度是O(n)。// 不穩定算法void heapSort(vector<int> &arr) {priority_queue<int,vector<int>,greater<int>> q; //小頂堆for (int i = 0; i < arr.size(); i++) {q.push(arr[i]);}for (int i = 0; i < arr.size(); i++) {arr[i] = q.top();q.pop();}}// 4、冒泡排序(超時)// 時間復雜度O(n2),空間復雜度O(1)// 從后往前排// 兩兩比較交換,最大的放在后面,穩定排序void bubbleSort(vector<int>& arr) {for (int i = 0; i < arr.size(); i++) {for (int j = 0; j < arr.size()-i-1; j++) {if (arr[j]>arr[j+1]) {swap(arr[j], arr[j+1]);}}}}// 5、選擇排序(超時)// 時間復雜度O(n2),空間復雜度O(1)// 從前往后排// 遍歷數組,找出最小值,最小的放在前面,不穩定排序void selectionSort(vector<int>& arr) {int minIndex = 0;for (int i = 0; i < arr.size(); i++) {minIndex = i;for (int j = i+1; j < arr.size(); j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}swap(arr[i], arr[minIndex]);}}// 6、插入排序(超時)// 時間復雜度O(n2),空間復雜度O(1)// 從前往后排// 遍歷數組,找出一個值,往排好的數組里面插入合適的位置。穩定排序void insetionSort(vector<int>& arr) {int preIndex = 0;int currentVal = 0;for (int i = 1; i < arr.size(); i++) {preIndex = i - 1;currentVal = arr[i];while (preIndex >= 0 && arr[preIndex] > currentVal) {arr[preIndex+1] = arr[preIndex];preIndex--;}arr[preIndex+1] = currentVal;}}};

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

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

相關文章

人生的八種投資

1、最心甘情愿的投資&#xff1a;兒女 投資大師羅杰斯一生成功無數&#xff0c;問及他最得意的一次投資時&#xff0c;他說&#xff0c;是自己的女兒。“我曾經覺得養孩子是既麻煩又浪費錢的事情&#xff0c;有了女兒才知道&#xff0c;這才是最能給你帶來幸福感的投資。” …

Linux操作系統load average過高,kworker占用較多cpu

Linux操作系統load average過高&#xff0c;kworker占用較多cpu 今天巡檢發現&#xff0c;mc1的K8S服務器集群有些異常&#xff0c;負載不太均衡。其中10.2.75.32-34&#xff0c;49的load average值都在40以上&#xff0c;雖然機器的cpu核數都是40或48核不算嚴重&#xff0c;但…

[flask]gunicorn配置文件

配置文件 #!/home/xx/.virtualenvs/xx/bin/python # encoding: utf-8import multiprocessing# 監聽端口 bind 0.0.0.0:5000 # 工作模式 worker_class gevent # 并行工作進程數 workers multiprocessing.cpu_count() * 1 # 設置守護進程 daemon True# 設置日志記錄水平 logl…

Linux 上 docker 安裝 oracle-xe-11g

環境&#xff1a; 2G 內存&#xff0c;60G 硬盤阿里云一臺&#xff08;帶寬 1M&#xff09;, 配置如下圖&#xff1a; 軟件&#xff1a;docker Docker version 1.6.2, build 7c8fca2 相關 link docker 鏡像站&#xff1a;https://store.docker.com 視頻教程&#xff1a;ht…

最易忽視的腎虛4件事

腎是人的“先天之本”&#xff0c;如果把人體比喻成一棵大樹&#xff0c;腎就是樹根&#xff0c;吸收、傳遞營養充足&#xff0c;大樹才能枝繁葉茂。腎虛了&#xff0c;可能引起各種健康問題。 然而&#xff0c;在現實中&#xff0c;人們常常會夸大腎虛&#xff0c;很多人把出…

【計算機網絡】wireshark數據流追蹤、圖像抓取(轉)

不廢話了直接上地址 https://www.cnblogs.com/grj001/p/12223954.html

stm32學習方法

很多新手都問過嵌入式系統學習方法&#xff0c;好的學習方法可以事半功倍&#xff0c;學習嵌入式系統&#xff0c;掌握了好的學習方法&#xff0c;自然可以水到渠成。創客學院的老師就通過本篇文章就來說說嵌入式系統學習方法&#xff0c;新手必看 第一&#xff0c;學習基本的裸…

知識點漏缺總結

模塊化 使用模塊化可以給我們帶來以下好處 解決命名沖突 提供復用性 提高代碼可維護性 Proxy Proxy 來替換原本的 Object.defineProperty 來實現數據響應式。 Proxy 是 ES6 中新增的功能&#xff0c;它可以用來自定義對象中的操作。 let p new Proxy(target, handler) 復制代碼…

成功投資的九大要訣

真正的有錢人對金錢持非常嚴肅的態度&#xff0c;即便是拿來投機也要小心睿智&#xff0c;物盡其用。這里的投機并不是指非理性的賭博&#xff0c;而是指為了追求更高收益而采取的市場投資行為。卡西研究所資深分析師Louis James總結了富豪們投機成功的9個秘訣。 秘訣1&#…

《 Docker 技術入門與實戰 》讀書筆記 ( CentOS 安裝 Docker )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS &#xff1a;個人所有讀書筆記只記錄個人想要的內容&#xff0c;很可能原書大量內容沒有納入筆記中... ... 以下全文內容出自書目&…

數據結構:靜態鏈表實現樹的同構

寫在最前面 按照課程講解的思路來寫&#xff0c;邏輯關系能夠理解清楚了&#xff0c;但是實際運行起來實在是有問題&#xff0c;雖然在PTA上能夠通過。但是我自己看不出問題來&#xff0c;并且&#xff0c;看了一遍又一遍仍然看不出來&#xff01;&#xff08;可能自己太笨。。…

中國人為什么學不會英語

英語永遠也學不會! 這種抱怨和哀嘆&#xff0c;大概在中國早已經司空見慣了。于是&#xff0c;有人開始計算學英語是多么大的浪費。 作為過來人&#xff0c;我對此深有體會。記得我當年也有過類似的絕望感。 但是&#xff0c;一位前輩安慰我說&#xff1a;你可以說你永遠掌…

研究人員發現:基于文本的AI模型容易受到改述攻擊

由于自然語言處理&#xff08;NLP&#xff09;的進步&#xff0c;越來越多的公司和組織開始利用AI算法來執行與文本相關的任務&#xff0c;例如&#xff1a;過濾垃圾郵件、分析社交媒體帖子和評論、評估簡歷以及檢測假新聞。 但是&#xff0c;真的可以相信這些算法能夠可靠地執…

解決 linux 下安裝 node 報: command not found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 注意&#xff1a;有時安裝成功后,需要關閉xshell&#xff0c;重新啟動。nvm才會生效。 1. 在 linux 下安裝 node 提示 -bash: node: com…

阿里云官方網站免費套餐怎么搶

阿里云推出包含云服務器 ECS、負載均衡、云數據庫 RDS、云數據庫 Redis 版、云數據庫 Mongodb 版、彈性公網 IP、CDN、對象存儲 OSS、文件存儲 NAS等40核心云產品&#xff0c;6個月免費使用何為免費套餐&#xff0c;其實就是讓你先體驗&#xff0c;覺得好用&#xff0c;易用&am…

1003 我要通過

1003 我要通過&#xff01; (20 分)“答案正確”是自動判題系統給出的最令人歡喜的回復。本題屬于 PAT 的“答案正確”大派送 —— 只要讀入的字符串滿足下列條件&#xff0c;系統就輸出“答案正確”&#xff0c;否則輸出“答案錯誤”。 得到“答案正確”的條件是&#xff1a; …

在英特爾? 凌動? 處理器上將 OpenGL* 游戲移植到 Android* (第一部分)

將游戲和其他使用大量 3D 圖形的應用從 OpenGL 標準移植到 Google Android 設備&#xff08;包括構建在英特爾 凌動? 微架構上的設備&#xff09;存在巨大的機遇&#xff0c;因為基于 OpenGL 的游戲、游戲引擎和其他傳統軟件易于獲得&#xff1b;OpenGL 便于移植&#xff1b;而…

文件系統:使用 yum 安裝軟件包

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、yum命令的基本安裝功能 [rootlocalhost ~]# man yum command is one of: * install package1 [package2] [...]&#xff1a; ins…

elasticsearch全局analyzer聲明

2019獨角獸企業重金招聘Python工程師標準>>> 問題 elasticsearch從2.4升級到5.6&#xff0c;elasticsearch.yml配置中有一些analyzer配置拷貝到新版本&#xff0c;啟動報錯 index :analysis :analyzer :lowercase_whitespace :type : customtokenizer : myTokenizer…

Parallels Desktop虛擬機無法關機提示“虛擬機處理器已被操作系統重置”

如果你在使用PD的時候遇到了這樣子的彈窗&#xff0c;恭喜你篇博文可以幫助你&#xff0c;因為我剛剛也遇到了這個問題。如果有幫助可以點一下推薦按鈕。 針對Windows電腦 啟動虛擬機創建快照使用管理員權限運行命令提示符執行powercfg -h off重啟試試成功了再刪除快照即可修改…