力扣-排序算法

排序算法,一般都可以使用std::sort()來快速排序。

這里介紹一些相關的算法,鞏固記憶。

快速排序

跟二分查找有一丟丟像。

首先選擇一個基準元素,一般就直接選擇第一個。然后兩個指針,一個指向第一個,一個指向最后一個。第一個現在是空,就從最后一個開始,跟基準元素做判斷,小于基準元素的就放到第一個位置,然后第一指針往后移。按這種順序直到兩個指針相遇,相遇的位置放入基準元素。然后從基準元素劈開兩半,再按相同方法排序。

void quicksort(vector<int> nums,int l,int r){if(l+1>=r)return;int first=l,last=r-1;int key=nums[first];while(first<=last){while(first<last&&nums[last]>=key)last--;nums[first]=nums[last];while(first<last&&nums[first]<=key)first++;nums[last]=nums[first];}nums[first]=key;quicksort(nums,l,first);quicksort(nums,first+1,r);
}

歸并算法

歸并算法是一種分治算法,先分再治。比如說8個數字。先分成4個4個,然后4個內部再繼續分,分成2個2個。2個排好序后合并,4個排好序后再合并。

void merge_sort(vector<int> &nums,int l,int r,vector<int>& temp){if(l+1>=r)return ;int m=(l+r)/2;merge_sort(nums,l,m,temp);merge_sort(nums,m+1,r,temp);int a=l,b=m,i=l;while(a<m||b<r){if(nums[a]<nums[b])nums[i++]=nums[a++];elsenums[i++]=nums[b++];}for(i=l;i<r;i++)nums[i]=temp[i];
}

插入排序

首先是一個數,本來就有序。接著兩個數進行排序。接著三個數。

所謂插入,比如說八個數進行排序,其實前七個已經有序,這個時候只需要把第八個插入到前七個數的合適位置即可。怎么插入,就從后往前,一個一個比較,如果小于就往前移。

void insert_sort(vector<int>& nums,int n){int i,j;for(i=0;i<n;i++){for(j=i;j>0;j--){if(nums[j]>nums[j-1])swap(nums[j],nums[j-1]);}}
}

冒泡排序

相鄰兩個數比較,大的往后移,每一輪最大的數將會移到最后。

可以進行一個優化,可能出現一種情況,從第二輪過后,其實數組已經是有序的了,但是按照算法步驟來走的話,即使已經排好序了,但仍是會進行后邊的比較,知道全部比較完成

因此,我們可以對代碼進行優化,如果發現在某趟排序中,沒有發生一次交換, 可以提前結束冒泡排序

解決方式:可以通過一個標志位來進行判斷

void bubble_sort(vector<int>& nums,int n){int flag=false;int i,j;for(i=1;i<n;i++){flag=false;for(j=1;j<n-i+1;j++){if(nums[j]<nums[j-1]){swap(nums[j],nums[j-1]);flag=true;}     }if(flag==false)return ;}
}

選擇排序

選擇最小的數跟第一個數交換,按照同樣的方法對后面的n-1個進行排序。

void select_sort(vector<int>& nums,int n){int i,j;for(i=0;i<n;i++){int m=i;for(j=i+1;j<n;j++){if(nums[j]<nums[m]){m=j;}}swap(nums[i],nums[m]);}
}

215.數組中的第K個元素

215. 數組中的第K個最大元素

給定整數數組?nums?和整數?k,請返回數組中第?k?個最大的元素。

請注意,你需要找的是數組排序后的第?k?個最大的元素,而不是第?k?個不同的元素。

你必須設計并實現時間復雜度為?O(n)?的算法解決此問題。

示例 1:

輸入: [3,2,1,5,6,4], k = 2輸出: 5

示例?2:

輸入: [3,2,3,1,2,4,5,5,6], k = 4輸出: 4

提示:

  • 1 <= k <= nums.length <= 10^{5}
  • -10^{4}?<= nums[i] <= 10^{4}

題解

可以利用快速排序的思想來解決這個問題。

選擇一個數,然后將大于它的數字往后移,小于的往前移。如果這個剛好是第k位,直接返回。如果不是,大于k,則對前面做相同的排序,如果不是就對后面做相似的排序。這里的k指的是第k大,因此從小到大排就是第n-k位。

class Solution {
public:int quickselect(vector<int> &nums,int l,int r,int k){if(l==r)return nums[k];int p=nums[l],i=l-1,j=r+1;while(i<j){do i++; while (nums[i] < p);do j--; while (nums[j] > p);if(i<j)swap(nums[i],nums[j]);}if(k<=j) return quickselect(nums,l,j,k);else return quickselect(nums,j+1,r,k);}int findKthLargest(vector<int> &nums, int k) {int n=nums.size();return quickselect(nums,0,n-1,n-k);}
};

347.前k個高頻元素

347. 前 K 個高頻元素

題目

給你一個整數數組?nums?和一個整數?k?,請你返回其中出現頻率前?k?高的元素。你可以按?任意順序?返回答案。

示例 1:

輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]

示例 2:

輸入: nums = [1], k = 1
輸出: [1]

提示:

  • 1 <= nums.length <= 10^{5}
  • k?的取值范圍是?[1, 數組中不相同的元素的個數]
  • 題目數據保證答案唯一,換句話說,數組中前?k?個高頻元素的集合是唯一的

題解

可以使用桶排序,使用STL庫中的unordered_map,提供了一種基于哈希表的鍵值對容器。

可以對每一個數字出現的次數進行計算并且存儲。

    unordered_map<int,int> m;for(int num:nums) m[num]++;

接著進行排序,然后再定義一個新的數組用來存儲要返回的數組。

class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int,int> m;for(int num:nums) m[num]++;vector<pair<int,int>> s;for(auto t:m)s.push_back({t.second,t.first});sort(s.begin(),s.end());vector<int> ans;int t=s.size()-1;while(k--){ans.push_back(s[t--].second);}return ans;}
};

排序這里也有一個庫可以使用。

<priority_queue>?是標準模板庫(STL)的一部分,用于實現優先隊列。

優先隊列是一種特殊的隊列,它允許我們快速訪問隊列中具有最高(或最低)優先級的元素。

class Solution {
public:vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int,int> m;for(int num:nums) m[num]++;priority_queue<pair<int,int>> s;for(auto i:m) s.emplace(i.second,i.first);vector<int> ans;while(k--){ans.push_back(s.top().second);s.pop();}return ans;}
};

不得不說如果熟悉使用STL庫,真的省事很多。

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

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

相關文章

編程玩具應用前景怎么樣:深入剖析四大方面、五大趨勢、六大挑戰與七大機遇

編程玩具應用前景怎么樣&#xff1a;深入剖析四大方面、五大趨勢、六大挑戰與七大機遇 在科技飛速發展的今天&#xff0c;編程玩具作為一種新興的教育工具&#xff0c;正逐漸走進人們的視野。那么&#xff0c;編程玩具的應用前景究竟如何呢&#xff1f;本文將從四個方面、五個…

測試類型介紹-安全性測試實戰技巧

安全性測試實戰技巧 在當今數字化時代&#xff0c;軟件安全不再是可選項&#xff0c;而是每一款產品的必備特性。隨著網絡攻擊的復雜性和頻率不斷上升&#xff0c;安全性測試成為了確保應用程序健壯性和用戶數據保護的關鍵環節。 1. 安全性測試的重要性? 安全性測試旨在識別…

Java如何使用 HttpClientUtils 發起 HTTP 請求

Java如何使用 HttpClientUtils 發起 HTTP 請求 一、前言1.HttpClientUtils 類概覽2.解析 HttpClientUtils 類3.使用 HttpClientUtils 類 一、前言 在現代的軟件開發中&#xff0c;經常需要與遠程服務器進行通信&#xff0c;例如獲取數據或發送數據。Apache HttpClient 是一個流…

安卓逆向經典案例——XX優品(uniapp)

uni-app逆向 uniapp的目錄結構 有一個io文件夾&#xff0c;下面有dcloud uniapp UniApp 可以用于開發 H5 應用&#xff0c;但它不僅僅局限于 H5 應用。UniApp 的特點包括&#xff1a; 1. 跨平臺&#xff1a;可以一套代碼同時生成適用于多個平臺&#xff08;如 iOS、Android、…

windows node降級到指定版本

要在Windows上將Node.js降級到指定版本&#xff0c;你可以使用nvm&#xff08;Node Version Manager&#xff09;來管理和切換不同的Node.js版本。以下是使用nvm降級Node.js的步驟&#xff1a; 如果尚未安裝nvm&#xff0c;請訪問https://github.com/coreybutler/nvm-windows …

Python學習筆記(二):函數

python英文官方文檔:https://docs.python.org/3.8/tutorial/index.html 比較不錯的python中文文檔:https://www.runoob.com/python3/python3-tutorial.html 1. 寫在前面 這幾周從實踐角度又學習了一遍python,溫故而知新,還是有蠻多心得的, 周末再看之前記的python筆記,…

Python技巧:使用enumerate函數增強你的for循環

在Python編程中&#xff0c;我們經常需要遍歷列表、元組或其他可迭代對象。然而&#xff0c;在某些情況下&#xff0c;我們可能還需要知道當前元素的索引。這時&#xff0c;enumerate函數就派上了用場。以下我們將深入探討enumerate函數的使用方法&#xff0c;并通過幾個示例來…

Java---數組

樂觀學習&#xff0c;樂觀生活&#xff0c;才能不斷前進啊&#xff01;&#xff01;&#xff01; 我的主頁&#xff1a;optimistic_chen 我的專欄&#xff1a;c語言 歡迎大家訪問~ 創作不易&#xff0c;大佬們點贊鼓勵下吧~ 前言 無論c語言還是java數組都是重中之重&#xff0…

LangChain 入門案例教程

LangChain 是一個基于 transformer 模型的語言鏈模型&#xff0c;它可以根據輸入文本生成相應的回答。下面是一個簡單的入門案例教程&#xff0c;旨在幫助您快速上手 LangChain。 1. 安裝 LangChain 首先&#xff0c;您需要安裝 LangChain。可以使用 pip 安裝&#xff1a; p…

【簡歷】湖南某一本大學:JAVA實習簡歷指導,面試通過率比較低

注&#xff1a;為保證用戶信息安全&#xff0c;姓名和學校等信息已經進行同層次變更&#xff0c;內容部分細節也進行了部分隱藏 簡歷說明 這個同學的學校是重點一本院校&#xff0c;這種學校背景我們建議大家嘗試投一下大廠&#xff0c;然后投遞主體在中廠。但是因為項目經歷…

曠野之間12 - 內容創作用的最佳大模型評測

?????? 我正在做一個項目,需要我找出最適合內容創作的 LLM。我查看了 lmsys 排行榜上的頂級模型,閱讀了其他人對這些模型的評價,查看了頂級 LLM 的模型卡,在沒有明確答案后,我決定對所有這些 LLM 進行測試,以完成不同的內容創作任務。 評估模型 我想要評估的模型…

在iPhone / iPad上輕松模擬GPS位置 AnyGo for Mac

在iPhone / iPad上輕松模擬GPS位置 AnyGo for Mac AnyGo for Mac是一款專為Mac電腦用戶設計的虛擬定位工具。它可以模擬你的GPS位置&#xff0c;讓你的設備顯示你在任何世界上的任何地方。無論你是想在游戲中虛擬移動&#xff0c;還是在社交媒體上分享虛擬的旅行照片&#xff0…

Flask+Layui開發案例教程

基于 Python 語言的敏捷開發框架_DjangoAdmin敏捷開發框架FlaskLayui版本_開發文檔 軟件產品基于 Python 語言&#xff0c;采用 Flask2.x、Layui、MySQL 等技術棧精心打造的一款集模塊化、高性能、組件化于一體的企業級敏捷開發框架&#xff0c;本著簡化開發、提升開發效率的初…

C 語言中如何實現字符串的拼接?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01; &#x1f4d9;C 語言百萬年薪修煉課程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入淺出&#xff0c;匠心打磨&#xff0c;死磕細節&#xff0c;6年迭代&…

Objective-C 中的 isa 不再是簡單的結構體指針

了解 Objective-C 中的 isa 指針內存結構 在 Objective-C 中&#xff0c;isa 指針是對象和類之間的重要橋梁。它不僅幫助運行時系統識別對象的類型&#xff0c;還參與了一些內存和性能優化。本文將深入講解 isa 指針的內存結構&#xff0c;包括其在早期和現代實現中的演變。 …

Linux使用python調用串口<Ubuntu>

要在 Ubuntu 上使用 /dev/ttyUSB0 設備編寫一個簡單的串口收發程序&#xff0c;你可以使用 Python&#xff0c;結合 pyserial 庫來實現。這種方法相對簡單&#xff0c;適用于各種串行通信任務。以下是如何在 Python 中編寫串口收發程序的步驟及代碼示例&#xff1a; 步驟 1: 安…

JWT重放漏洞攻防策略

JWT重放漏洞概述 概念&#xff1a;JWT&#xff08;JSON Web Token&#xff09;是Web應用廣泛使用的身份驗證令牌。重放攻擊&#xff1a;攻擊者截獲JWT后&#xff0c;利用其有效性冒充用戶執行操作。 重放攻擊的危害 權限濫用&#xff1a;攻擊者可越權操作&#xff0c;如非法…

ffmpeg新舊函數對比

搬運博客園“kn-zheng”大佬博客 從FFmpeg 3.0 開始 &#xff0c; 使用了很多新接口&#xff0c;對不如下&#xff1a; 1、avcodec_decode_video2() 原本的解碼函數被拆解為兩個函數avcodec_send_packet()和avcodec_receive_frame() 具體用法如下&#xff1a; old: avcodec_d…

MySQL8之mysql-community-embedded-compat的作用

MySQL8中的mysql-community-embedded-compat包的作用主要是提供MySQL服務器作為嵌入式庫時的兼容性支持&#xff0c;特別是對于那些使用庫版本18的應用程序。嵌入式MySQL服務器允許開發者將MySQL數據庫直接嵌入到他們的應用程序中&#xff0c;而無需運行獨立的MySQL服務器進程。…

Transformer 論文通俗解讀:FFN 的作用

在經過前面3節關于 Transformer 論文的解讀之后&#xff0c;相信你對提出 Transformer 架構的這篇論文有了一定的了解了&#xff0c;你可以點擊下面的鏈接復習一下前3節的內容。 《Attention is all you need》通俗解讀&#xff0c;徹底理解版&#xff1a;part1 《Attention …