排序(2)

我們在排序(1)中說到選擇排序的代碼:

void SelectSort(int* a,int n)
{int begin=0,end=n-1;int mini=begin,max=begin;for(int i=begin+1;i<=end;i++){if(a[i]>a[max]){maxi=i;}if(a[i]<a[mini]){mini=i;}++begin;--end;}Swap(&a[beign],&a[mini]);Swap(&a[end],&a[maxi]);
}

那么當我們解決下面這個問題的時候:當開始時,begin=0,end=7,mini=begin=0,maxi=begin=0。i=1,1小于0,所以mini=1。a[mini]=1,++begin,begin=1,--end,end=6。此時最大值是9(begin),最小值是1(i)。

i=2,begin=1,end=6。

當begin和max重合,就會出現

4 3 5 6?

正確的代碼應該是這樣的:

void SelectSort(int* a,int n)
{int begin=0,end=n-1;int mini=begin,maxi=begin;for(int i=begin+1;i<=end;i++){if(a[i]>a[max]){maxi=i;}if(a[i]<a[mini]){mini=i;}}Swap(&a[begin],&a[mini]);if(maxi==begin){maxi=mini;}Swap(&a[end],&a[maxi]);++begin;--end;
}

快速排序

把小的換到左邊,把大的換到右邊。

動圖鏈接地址如下:

https://gitee.com/bithange/113-issues/raw/master/24%E5%B9%B4-05%E6%9C%8827%E6%97%A5--%E6%8E%92%E5%BA%8F/%E5%8A%A8%E5%9B%BE/hoare.gif?單趟快排代碼如下:

void QuickSort(int* a,int left,int right)
{int key=a[left];int begin=left,end=right;while(begin<end){//右邊找小while(begin<end&&a[end]>=key)//加等號,相等的值放左邊或者右邊都無所謂{--end;}//左邊找大while(begin<end&&a[begin]>key){++begin;}Swap(&a[begin],&a[end]);}Swap(key,&a[begin]);
}

這段代碼有一些問題,讓我們逐個解決吧!

首先,記錄值只是復制了一個值,比如
int a = 10;
int b = a;
修改b的值對a的值沒有影響
記錄索引,修改的就是索引對應的值

什么情況下不需要對數組進行分割了呢?一種是這個區間只有一個值,另一只種是這個區間不存在。(結束條件)
?

void QuickSort(int* a,int left,int right)
{int keyi=left;int begin=left,end=right;if(left>right)return;while(begin<end){//右邊找小while(begin<end&&a[end]>=key)//加等號,相等的值放左邊或者右邊都無所謂{--end;}//左邊找大while(begin<end&&a[begin]>key){++begin;}Swap(&a[begin],&a[end]);}Swap(&a[keyi],&a[begin]);keyi=begin;//[left,keyi-1] keyi [keyi+1,right]'QuickSort(a,left,keyi-1);QuickSort(a,keyi+1,right);
}

選key如果每一次都在最前面,那么就不合理,我們期望選擇的key每次都是最中間的值。

1隨機數選key

2三數取中(把選中的數挪到最左邊)

int GetMid(int* a,int left,int right)
{int mid=(left+right)/2;if(a[left]<a[mid]){if(a[mid]<a[right]){return mid;}else if(a[left]<a[right]){return right;}elsereturn left;}else{if(a[mid]>a[right]){return mid;}else if(a[left]<a[right]){return left;}elsereturn right;}
}

但是當需要排序的數字只有幾個時,需要進行的趟數就多了,而且很浪費。所以,在進行判斷時,我們需要加上一個條件。那么在這樣一個數字較少的情況下,我們應該選擇哪種排序呢?希爾排序的優勢就是讓大的數更快跳到后面,小的數更快跳到前面。

int GetMid(int* a,int left,int right)
{if(right-left+1<10)//小區間優化,不再遞歸分割排序,減少遞歸次數{InsertSort(a+left,right-left+1);}else{int mid=(left+right)/2;if(a[left]<a[mid]){if(a[mid]<a[right]){return mid;}else if(a[left]<a[right]){return right;}elsereturn left;}else{if(a[mid]>a[right]){return mid;}else if(a[left]<a[right]){return left;}elsereturn right;}}
}

結論:左邊做key,右邊先走,可以保證相遇位置的值比key要小。
相遇的場景分析:
L遇R:R先走,停下來,R停下條件是遇到比key小的值,R停的位置一定比key小,L沒有找大的,遇到R停下了
R遇L:R先走,找小,沒有找到比key小的,直接跟L相遇了。L停留的位置是上一輪交換的位置,上一輪交換,把比key小的值,換到L的位置了

相反,讓右邊做key,左邊先走,可以保證相遇位置的值比key要大。

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

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

相關文章

SKF軸承故障頻率查詢

1&#xff0c;第一步&#xff1a;搜索軸承型號 skf官網 2&#xff0c;第二步&#xff1a;查詢故障頻率。 第三步&#xff1a;

尚品匯-(十四)

&#xff08;1&#xff09;提交git 商品后臺管理到此已經完成&#xff0c;我們可以把項目提交到公共的環境&#xff0c;原來使用svn&#xff0c;現在使用git 首先在本地創建ssh key&#xff1b; 命令&#xff1a;ssh-keygen -t rsa -C "your_emailyouremail.com" I…

完美解決ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)

已解決ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO) 下滑查看解決方法 文章目錄 報錯問題解決思路解決方法交流 報錯問題 ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO) 解決思路 對…

InfluxDB v2.x中的Flux基本概念

InfluxDB v2.x中的Flux查詢語言的核心概念主要包括以下幾個方面&#xff1a; 1. 表&#xff08;Tables&#xff09; Flux以表&#xff08;Tables&#xff09;的形式處理數據。每個表包含多行數據&#xff0c;每行數據都是一個record&#xff08;記錄&#xff09;&#xff0c;…

落日余暉映晚霞

落日余暉映晚霞&#xff0c;立于海濱&#xff0c;望夕陽余暉灑于波光粼粼之上&#xff0c;金光跳躍&#xff0c;若繁星閃爍&#xff0c;耀人心目。 海風輕拂&#xff0c;心境寧靜&#xff0c;凡塵俗務皆于此剎那消散&#xff0c;思緒萬干&#xff0c;或憶往昔點滴&#xff0c;或…

刷爆leetcode第十期

題目一 相同的樹 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 首先我們要來判斷下它們的根是否相等 根相等的話是否它們的左子樹相等 是否…

在CMD中創建虛擬環境并在VSCode中使用和管理

1. 使用Conda創建虛擬環境 在CMD或Anaconda Prompt中執行以下代碼以創建一個新的虛擬環境&#xff1a; conda create -n my_env python 3.8 這樣會創建一個名為 my_env 的環境&#xff0c;并在Anaconda環境目錄下生成一個相應的文件夾&#xff0c;包含該虛擬環境所需的所有…

GD32實戰篇-雙向數控BUCK-BOOST-BOOST升壓理論基礎

本文章基于兆易創新GD32 MCU所提供的2.2.4版本庫函數開發 向上代碼兼容GD32F450ZGT6中使用 后續項目主要在下面該專欄中發布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感興趣的點個關注收藏一下吧! 電機驅動開發可以跳轉…

MySQL之備份與恢復(八)

備份與恢復 還原邏輯備份 如果還原的是邏輯備份而不是物理備份&#xff0c;則與使用操作系統簡單地復制文件到適當位置的方式不同&#xff0c;需要使用MySQL服務器本身來加載數據到表中。在加載導出文件之前&#xff0c;應該先花一點時間考慮文件有多大&#xff0c;需要多久加…

金蝶云蒼穹-插件開發(二)新建、更新、刪除數據

加載本頁面數據 關于加載數據&#xff0c;還要多補充一個點&#xff0c;如果要加載一個基礎資料/單據界面中正在操作的界面&#xff0c;比如要獲取剛填寫好的字段值&#xff0c;就要獲取當前界面的模型層&#xff0c;再獲取具體數據。具體操作如下&#xff1a; //獲取日任務信…

C++ 函數高級——函數的占位參數

C中函數的形參列表里可以有占位參數&#xff0c;用來做占位&#xff0c;調用函數時必須填補改位置 語法&#xff1a; 返回值類型 函數名&#xff08;數據類型&#xff09;{ } 在現階段函數的占位參數存在意義不大&#xff0c;但是后面的課程中會用到該技術 示例&#xff1a;…

STM32快速復習(八)SPI通信

文章目錄 前言一、SPI是什么&#xff1f;SPI的硬件電路&#xff1f;SPI發送的時序&#xff1f;二、庫函數二、庫函數示例代碼總結 前言 SPI和IIC通信算是我在大學和面試中用的最多&#xff0c;問的最多的通信協議 IIC問到了&#xff0c;一般SPI也一定會問到。 SPI相對于IIC多了…

heml之樣式布局技巧博客

在編寫關于 HEML&#xff08;HTML CSS JavaScript&#xff09;的樣式布局技巧博客時&#xff0c;可以涵蓋很多不同的方面 1. 響應式設計 介紹媒體查詢&#xff08;Media Queries&#xff09;以及如何根據設備尺寸調整樣式。使用百分比寬度、視口單位&#xff08;vw、vh&…

含并行連結的網絡

一、Inception塊 1、白色部分通過降低通道數來控制模型復雜度&#xff0c;藍色做特征提取工作&#xff0c;每條路上的通道數可能不同&#xff0c;大概我們會把更重要的那部分特征分配更多的通道數 2、Inception只改變高寬&#xff0c;不改變通道數 3、在不同的情況下需要選擇…

pin是什么?管腳

1.平面分割 1)啟動Allegro PCB design &#xff0c;打開.brd。深色部分屬于一個net&#xff0c;要做一下修改&#xff0c;將上面的pin包含進shape中&#xff0c;i進行a&#xff0c;b兩步操作&#xff0c;刪除以前存在的Anti Etch下的line&#xff0c;再將其進行補齊 使它保住上…

【幀中繼實驗-ensp】

實驗要求 在R1上開啟一個點對點子接口&#xff0c;用于連接 R1–R2&#xff0c;兩端IP地址為12.1.1.x 。開啟一個多點子接口 &#xff0c;用于連接R1–R3&#xff0c;R4&#xff0c;兩段IP地址為134.1.1.x。 具體DLCI分配和映射關系如下&#xff1a; R1 102 R2 201—動態映射…

python獲取海康威視所有攝像頭的OSD通道名稱

讀取IP地址的txt文檔 根據IP地址獲取監控攝像頭的OSD通道名稱 # codingutf-8 import os import time import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth import xml.etree.ElementTree as ET #注意&#xff1a;和ip.txt放在一個文件夾&#xff0c;會生…

論文略讀:Can Long-Context Language Models Subsume Retrieval, RAG, SQL, and More?

202406 arxiv 1 intro 傳統上&#xff0c;復雜的AI任務需要多個專門系統協作完成。 這類系統通常需要獨立的模塊來進行信息檢索、問答和數據庫查詢等任務大模型時代&#xff0c;尤其是上下文語言模型&#xff08;LCLM&#xff09;時代&#xff0c;上述問題可以“一體化”完成…

【程序大俠傳】大表分庫分表切換數據庫類型導致pagehelper生成sql語法報錯

前序 代碼劍宗等級分明&#xff0c;其門下弟子等級劃分如下&#xff1a; 入門弟子 剛剛拜入代碼劍宗&#xff0c;學習基礎編程語言和基本劍法&#xff08;語法和基礎概念&#xff09;。他們的代碼還顯得生澀&#xff0c;但已經開始展現出對優雅代碼的追求。 江湖小蝦 初步掌握…

《python程序語言設計》2018版第5章第53題利用turtle繪制sin和cos函數 sin藍色,cos紅色和52題類似

直接上題和代碼 5.53 &#xff08;Turtle&#xff1a;繪制sin和cos函數&#xff09;編寫程序繪制藍色的sin函數和紅色的cos函數。 代碼和結果 turtle.speed(10) turtle.penup() # sin 用藍色 turtle.color("blue") #這道題和上道題一樣&#xff0c;先把turtle放到起始…