【排序算法】選擇排序以及需要注意的問題

選擇排序的基本思想:每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完 。

第一種實現方法:

void SelectSort(int* arr, int n)
{for (int j = 0;j < n - 1;j++){int mini = n - 1;int begin = j;for (int i = begin;i < n - 1;i++){if (arr[mini] > arr[i])mini = i;}int tmp = arr[mini];arr[mini] = arr[begin];arr[begin] = tmp;}
}int main()
{int a[] = { 8,5,7,8,9,0,9,3};SelectSort(a, sizeof(a) / sizeof(a[0]));for (auto e : a){cout << e << " ";};return 0;
}

第二種方法:

如果要將一數組排為升序,將數組第一個元素的下標用begin記錄,數組的第二個元素用end記錄;遍歷第一遍數組將數組中的最大值的下標用maxi記錄,將數組的最小值的下標用mini記錄;第一遍遍歷數組結束后將此時數組的最大值與下標為end元素的值交換,數組最小值與下標為begin元素的值交換,然后--begin? ++end,如此循環,指導begin<=end時結束。

編譯結果情況1,此時的待排序數組是:8,5,7,8,9,0,9,3 可以看到運行結果顯然不是我們所想要的。

void swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}void SelectSort(int* a, int n)
{int begin = 0;int end = n - 1;while (begin < end){int maxi = end, mini = begin;for (int i = begin;i <= end;i++){if (a[maxi] < a[i])maxi = i;if (a[mini] > a[i])mini = i;}swap(a[begin], a[mini]);swap(a[end], a[maxi]);--end;++begin;}
}int main()
{int a[] = { 8,5,7,8,9,0,9,3};SelectSort(a, sizeof(a) / sizeof(a[0]));for (auto e : a){cout << e << " ";};return 0;
}

?

情況2:但是當待排序數組是 8,5,7,8,0,9,9,3時

這是因為第2種情況中的待排序數組進行第四次循環時,出現了交換兩次的問題,如下:

因此我們需要注意當end-begin=1時的情況,接下來對代碼進行優化:

void SelectSort(int* a, int n)
{int begin = 0;int end = n - 1;while (begin < end){int maxi = end, mini = begin;for (int i = begin;i <= end;i++){if (a[maxi] < a[i])maxi = i;if (a[mini] > a[i])mini = i;}swap(a[begin], a[mini]);if(begin+1!=end)//或者是if(end - begin > 1)swap(a[end], a[maxi]);--end;++begin;}
}
int main()
{int a[] = { 8,5,7,8,0,9,9 ,3 };SelectSort(a, sizeof(a) / sizeof(a[0]));for (auto e : a){cout << e << " ";};return 0;
}

?

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

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

相關文章

【kubernetes】探索k8s集群中金絲雀發布后續 + 聲明式資源管理yaml

目錄 一、K8S常見的發布方式 1.1藍綠發布 1.2灰度發布&#xff08;金絲雀發布&#xff09; 1.3滾動發布 二、金絲雀發布 三、聲明式管理方法 3.1YAML 語法格式 3.1.1查看 api 資源版本標簽 3.1.2查看資源簡寫 3.2YAML文件詳解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

CSS3特殊屬性

特殊屬性 will-change will-change 屬性用于向瀏覽器提供提示,表明某個元素或其特定屬性在未來極有可能發生變化。這有助于瀏覽器提前優化相關渲染流程,提升動畫或其他動態效果的性能。 element {will-change: auto | <animateable-feature> [, <animateable-feat…

C++系列-C/C++內存管理方式

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” C/C內存分布 在這篇文章開始之前&#xff0c;我們先以一道題目來進行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java進階學習筆記27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可變字符串對象&#xff0c;相當于一個容器&#xff0c;它里面裝的字符串是可以改變的&#xff0c;就是用來操作字符串的。 好處&#xff1a; StringBuilder比String更適合做字符串的修改操作&#xff0c;效率會更高&#xff0c;…

在CSDN上成長的感悟,你的粉絲長啥樣?

文章目錄 一、寫作的初衷1. 記錄所學內容2.鞏固所學知識3.分享與幫助4.方便后續查找5.獲取激勵 二、你的粉絲長啥樣&#xff1f;1. 粉絲的特點與困惑2. 關于粉絲&#xff0c;細思極恐 三、繼續前行、堅持初心 在CSDN上寫博文&#xff0c;對于我來說&#xff0c;不僅僅是一個記錄…

OTA在線旅行社系統架構:連接世界的科技紐帶

隨著互聯網的快速發展和人們對旅行需求的不斷增長&#xff0c;OTA&#xff08;Online Travel Agency&#xff09;在線旅行社成為了現代旅行業中的重要一環。OTA系統架構的設計和實現將對旅行行業產生深遠影響。本文將探討OTA在線旅行社系統架構的重要性和關鍵組成部分&#xff…

異構圖上的連接預測一

這里寫目錄標題 異構圖&#xff1f;處理數據&#xff1a; 異構圖&#xff1f; 異構圖&#xff1a;就是指節點與邊類型不同的圖。 連接預測&#xff1a;目的是預測圖中兩個節點之間是否存在一條邊&#xff0c;或者是預測兩個節點之間&#xff0c;在未來可能形成的連接。 eg&…

Linux系統如何通過編譯方式安裝python3.11.3

1.切換到/data 目錄 cd /data 2.下載python源碼Python-3.11.3.tgz wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz tar -xzf Python-3.11.0.tgz cd Python-3.11.3 3.配置python的安裝路徑 和 執行openssl的路徑 ./configure --prefix/usr/local/pyth…

Java筑基(三)

Java筑基&#xff08;三&#xff09; 一、final概念1、案例1&#xff1a;采用繼承&#xff1a;2、案例2&#xff1a;final修飾的類不可以被繼承&#xff1a;3、案例3&#xff1a;final修飾的類不能有子類&#xff0c;但是可以有父類4、final修飾構造方法5、final修飾普通方法6、…

頭歌GCC編程工具集第1關:實驗工具GCC與objdump的使用

任務要求 根據提示&#xff0c;在右側編輯器中顯示的bytes.c文件中的 Begin-End 之間補充代碼&#xff08;即設置一個數組的初始值&#xff09;&#xff0c;使其與如下顯示的main.c文件一起編譯、生成的程序在運行時輸出“SUCCESS”。 程序源文件main.c的內容如下&#xff08;務…

牛客前端面試高頻八股總結(1)(附文檔)

1.html語義化 要求使用具有語義的標簽&#xff1a;header footer article aside section nav 三點好處&#xff1a; &#xff08;1&#xff09;提高代碼可讀性&#xff0c;頁面內容結構化&#xff0c;更清晰 &#xff08;2&#xff09;無css時&#xff0c;時頁面呈現出良好…

滲透工具CobaltStrike工具的下載和安裝

一、CobalStrike簡介 Cobalt Strike(簡稱為CS)是一款基于java的滲透測試工具&#xff0c;專業的團隊作戰的滲透測試工具。CS使用了C/S架構&#xff0c;它分為客戶端(Client)和服務端(Server)&#xff0c;服務端只要一個&#xff0c;客戶端可有多個&#xff0c;多人連接服務端后…

Golang設計模式(四):觀察者模式

觀察者模式 什么是觀察者 觀察者模式(Observer Pattern)&#xff1a;定義對象之間的一種一對多依賴關系&#xff0c;使得每當一個對象狀態發生改變時&#xff0c;其相關依賴對象皆得到通知并被自動更新。觀察者模式的別名包括發布-訂閱&#xff08;Publish/Subscribe&#xf…

音視頻開發8 音視頻中SDL的使用,SDL 在windows上環境搭建,SDL 使用 以及 常用 API說明,show YUV and play PCM

1.SDL簡介 SDL&#xff08;Simple DirectMedia Layer&#xff09;&#xff0c;是一個跨平臺的C語言多媒體開發庫。 支持Windows、Mac OS X、Linux、iOS、Android 提供對音頻、鍵盤、鼠標、游戲操縱桿、圖形硬件的底層訪問 很多的視頻播放軟件、模擬器、受歡迎的游戲都在使用…

面試中算法(A星尋路算法)

一、問題需求&#xff1a; 迷宮尋路游戲中&#xff0c;有一些小怪物要攻擊主角&#xff0c;現在希望你給這些小怪物加上聰 明的AI (Artificial Intelligence&#xff0c;人工智能&#xff09;&#xff0c;讓它們可以自動繞過迷宮中的障礙物&#xff0c;尋找到主角的所在。 A星…

json web token及JWT學習與探索

JSON Web Token&#xff08;縮寫 JWT&#xff09;是目前最流行的跨域認證解決方案 作用&#xff1a; 主要是做鑒權用的登錄之后存儲用戶信息 生成得token(令牌)如下 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNjg3Njc0NDkyLCJleHAiOjE2ODc3NjA4OTJ9.Y6eFG…

Django使用fetch實現登錄

Django使用session管理&#xff08;cookie&#xff09;實現了一個用戶登錄和會話保持功能。如果需求不太復雜可以使用Django默認的登錄功能。 1 安裝django-cors-headers 首先需要安裝django-cors-headers pip install django-cors-headers2 在settings中配置 需要按照djan…

用Dockerfile和Shell腳本來部署一個Go項目

如何使用Dockerfile和Shell腳本來部署一個Go項目。這種方法能夠幫助我們自動化構建、測試和部署流程&#xff0c;提高開發效率。 **一、項目結構和代碼** 首先&#xff0c;我們需要準備一個Go項目。假設我們的項目結構如下&#xff1a; my-go-app/ ├── main.go ├── D…

1107 老鼠愛大米

solution 記錄每組的最大值&#xff0c;并比較組間的最大值胖胖鼠~ #include<iostream> using namespace std; int main(){int n, m, ans, fat -1, x;scanf("%d%d", &n, &m);for(int i 0; i < n; i){ans -1;for(int j 0; j < m; j){scanf(…

【C/C++】Makefile文件的介紹與基本用法

創作不易&#xff0c;本篇文章如果幫助到了你&#xff0c;還請點贊 關注支持一下?>&#x16966;<)!! 主頁專欄有更多知識&#xff0c;如有疑問歡迎大家指正討論&#xff0c;共同進步&#xff01; &#x1f525;c系列專欄&#xff1a;C/C零基礎到精通 &#x1f525; 給大…