-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
選擇排序算法
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于選擇排序算法的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、選擇排序算法的思想是什么?
次序關(guān)系,采用分治策略,可在最壞的情況下用O(log n)完成搜索任務(wù)。它的基本思想是,將n個元素分成個數(shù)大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,算法終止。如果x<a[n/2],則我們只要在數(shù)組a的左半部繼續(xù)搜索x(這里假設(shè)數(shù)組元素呈升序排列)。如果x>a[n/2],則我們只要在數(shù)組a的右半部繼續(xù)搜索x。二分搜索法的應(yīng)用極其廣泛,而且它的思想易于理解,但是要寫一個正確的二分搜索算法也不是一件簡單的事。第一個二分搜索算法早在1946年就出現(xiàn)了,但是第一個完全正確的二分搜索算法直到1962年才出現(xiàn)。Bentley在他的著作《Writing Correct Programs》中寫道,90%的計算機專家不能在2小時內(nèi)寫出完全正確的二分搜索算法。問題的關(guān)鍵在于準(zhǔn)確地制定各次查找范圍的邊界以及終止條件的確定,正確地歸納奇偶數(shù)的各種情況,其實整理后可以發(fā)現(xiàn)它的具體算法是很直觀的,我們可用C++描述如下:
template<class Type>
int BinarySearch(Type a[],const Type& x,int n)
{
int left=0;
int right=n-1;
while(left<=right){
int middle=(left+right)/2;
if (x==a[middle]) return middle;
if (x>a[middle]) left=middle+1;
else right=middle-1;
}
return -1;
}
模板函數(shù)BinarySearch在a[0]<=a[1]<=...<=a[n-1]共n個升序排列的元素中搜索x,找到x時返回其在數(shù)組中的位置,否則返回-1。容易看出,每執(zhí)行一次while循環(huán),待搜索數(shù)組的大小減少一半,因此整個算法在最壞情況下的時間復(fù)雜度為O(log n)。在數(shù)據(jù)量很大的時候,它的線性查找在時間復(fù)雜度上的優(yōu)劣一目了然。
選擇排序
基本思想是:每次選出第i小的記錄,放在第i個位置(i的起點是0,按此說法,第0小的記錄實際上就是最小的,有點別扭,不管這么多了)。當(dāng)i=N-1時就排完了。
直接選擇排序
直選排序簡單的再現(xiàn)了選擇排序的基本思想,第一次尋找最小元素的代價是O(n),如果不做某種特殊處理,每次都使用最簡單的尋找方法,自然的整個排序的時間復(fù)雜度就是O(n2)了。
冒泡法
為了在a[1]中得到最大值,我們將a[1]與它后面的元素a[2],a[3],...,a[10]進行比較。首先比較a[1]與a[2],如果a[1]<a[2],則將a[1]與a[2]交換,否則不交換。這樣在a[1]中得到的是a[1]與a[2]中的大數(shù)。然后將a[1]與a[3]比較,如果a[1]<a[3],則將a[1]與a[3]交換,否則不交換。這樣在a[1]中得到的是a[1],a[2],a[3]中的最大值,...。如此繼續(xù),最后a[1]與a[10]比較,如果a[1]<a[10],則將a[1]與a[10]交換,否則不交換。這樣在a[1]中得到的數(shù)就是數(shù)組a的最大值(一共進行了9次比較)。
為了在a[2]中得到次大值,應(yīng)將a[2]與它后面的元素a[3],a[4],...,a[10]進行比較。這樣經(jīng)過8次比較,在a[2]是將得到次大值。
如此繼續(xù),直到最后a[9]與a[10]比較,將大數(shù)放于a[9],小數(shù)放于a[10],全部排序到此結(jié)束。
從上面可以看出,對于10個數(shù),需進行9趟比較,每一趟的比較次數(shù)是不一樣的。第一趟需比較9次,第二趟比較8次,...,最后一趟比較1次。
以上數(shù)組元素的排序,用二重循環(huán)實現(xiàn),外循環(huán)變量設(shè)為i,內(nèi)循環(huán)變量設(shè)為j。外循環(huán)重復(fù)9次,內(nèi)循環(huán)依次重復(fù)9,8,...,1次。每次進行比較的兩個元素,第一個元素與外循環(huán)i有關(guān)的,用a[i]標(biāo)識,第二個元素是與內(nèi)循環(huán)j有關(guān)的,用a[j]標(biāo)識,i的值依次為1,2,...,9,對于每一個i, j的值依次為i+1,i+2,...。
二、排序算法有多少種
排序(Sorting) 是計算機程序設(shè)計中的一種重要操作,它的功能是將一個數(shù)據(jù)元素(或記錄)的任意序列,重新排列成一個關(guān)鍵字有序的序列。
排序就是把集合中的元素按照一定的次序排序在一起。一般來說有升序排列和降序排列2種排序,在算法中有8中基本排序:
(1)冒泡排序;
(2)選擇排序;
(3)插入排序;
(4)希爾排序;
(5)歸并排序;
(6)快速排序;
(7)基數(shù)排序;
(8)堆排序;
(9)計數(shù)排序;
(10)桶排序。
插入排序
插入排序算法是基于某序列已經(jīng)有序排列的情況下,通過一次插入一個元素的方式按照原有排序方式增加元素。這種比較是從該有序序列的最末端開始執(zhí)行,即要插入序列中的元素最先和有序序列中最大的元素比較,若其大于該最大元素,則可直接插入最大元素的后面即可,否則再向前一位比較查找直至找到應(yīng)該插入的位置為止。插入排序的基本思想是,每次將1個待排序的記錄按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子序列中,尋找最適當(dāng)?shù)奈恢?,直至全部記錄插入完畢。?zhí)行過程中,若遇到和插入元素相等的位置,則將要插人的元素放在該相等元素的后面,因此插入該元素后并未改變原序列的前后順序。我們認(rèn)為插入排序也是一種穩(wěn)定的排序方法。插入排序分直接插入排序、折半插入排序和希爾排序3類。
冒泡排序
冒泡排序算法是把較小的元素往前調(diào)或者把較大的元素往后調(diào)。這種方法主要是通過對相鄰兩個元素進行大小的比較,根據(jù)比較結(jié)果和算法規(guī)則對該二元素的位置進行交換,這樣逐個依次進行比較和交換,就能達到排序目的。冒泡排序的基本思想是,首先將第1個和第2個記錄的關(guān)鍵字比較大小,如果是逆序的,就將這兩個記錄進行交換,再對第2個和第3個記錄的關(guān)鍵字進行比較,依次類推,重復(fù)進行上述計算,直至完成第(n一1)個和第n個記錄的關(guān)鍵字之間的比較,此后,再按照上述過程進行第2次、第3次排序,直至整個序列有序為止。排序過程中要特別注意的是,當(dāng)相鄰兩個元素大小一致時,這一步操作就不需要交換位置,因此也說明冒泡排序是一種嚴(yán)格的穩(wěn)定排序算法,它不改變序列中相同元素之間的相對位置關(guān)系。
選擇排序
選擇排序算法的基本思路是為每一個位置選擇當(dāng)前最小的元素。選擇排序的基本思想是,基于直接選擇排序和堆排序這兩種基本的簡單排序方法。首先從第1個位置開始對全部元素進行選擇,選出全部元素中最小的給該位置,再對第2個位置進行選擇,在剩余元素中選擇最小的給該位置即可;以此類推,重復(fù)進行“最小元素”的選擇,直至完成第(n-1)個位置的元素選擇,則第n個位置就只剩唯一的最大元素,此時不需再進行選擇。使用這種排序時,要注意其中一個不同于冒泡法的細(xì)節(jié)。舉例說明:序列58539.我們知道第一遍選擇第1個元素“5”會和元素“3”交換,那么原序列中的兩個相同元素“5”之間的前后相對順序就發(fā)生了改變。因此,我們說選擇排序不是穩(wěn)定的排序算法,它在計算過程中會破壞穩(wěn)定性。
快速排序
快速排序的基本思想是:通過一趟排序算法把所需要排序的序列的元素分割成兩大塊,其中,一部分的元素都要小于或等于另外一部分的序列元素,然后仍根據(jù)該種方法對劃分后的這兩塊序列的元素分別再次實行快速排序算法,排序?qū)崿F(xiàn)的整個過程可以是遞歸的來進行調(diào)用,最終能夠?qū)崿F(xiàn)將所需排序的無序序列元素變?yōu)橐粋€有序的序列。
歸并排序
歸并排序算法就是把序列遞歸劃分成為一個個短序列,以其中只有1個元素的直接序列或者只有2個元素的序列作為短序列的遞歸出口,再將全部有序的短序列按照一定的規(guī)則進行排序為長序列。歸并排序融合了分治策略,即將含有n個記錄的初始序列中的每個記錄均視為長度為1的子序列,再將這n個子序列兩兩合并得到n/2個長度為2(當(dāng)凡為奇數(shù)時會出現(xiàn)長度為l的情況)的有序子序列;將上述步驟重復(fù)操作,直至得到1個長度為n的有序長序列。需要注意的是,在進行元素比較和交換時,若兩個元素大小相等則不必刻意交換位置,因此該算法不會破壞序列的穩(wěn)定性,即歸并排序也是穩(wěn)定的排序算法。
三、試述排序算法的一般選擇規(guī)則 求解答
當(dāng)數(shù)據(jù)量不大時,選插入或選擇排序,不要用冒泡排序,當(dāng)數(shù)據(jù)量大而又注重空間復(fù)雜性時選擇快速排序或堆排序。
選擇排序法就是在遍歷一組數(shù)據(jù)之前先選擇一個元素,如果后面的元素小于選擇的元素,則將后面的元素與選擇的元素進行交換,直到遍歷到最后一個元素,這樣經(jīng)過一次遍歷后就會得到這組數(shù)據(jù)的最小的元素也就是有序數(shù)據(jù)的第一個元素。按照這樣的方式繼續(xù)選擇元素繼續(xù)遍歷,直到遍歷到這組數(shù)據(jù)完全有序。
擴展資料:
注意事項:
非線性時間比較類排序:通過比較來決定元素間的相對次序,由于其時間復(fù)雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。
線性時間非比較類排序:不通過比較來決定元素間的相對次序,可以突破基于比較排序的時間下界,以線性時間運行,因此稱為線性時間非比較類排序。
將待排序數(shù)組按照步長gap進行分組,然后將每組的元素利用直接插入排序的方法進行排序,每次將gap折半減小,循環(huán)上述操作,當(dāng)gap=1時,利用直接插入,完成排序。
參考資料來源:百度百科-排序算法
四、C語言選擇排序法
這是選擇排序。先用a[0]與a[1]比較,當(dāng)a[0]<a[1]時并不交換,而用k記下來現(xiàn)在a[0]最小……這樣一趟比較完后a[k]就是整個數(shù)組中最小的元素,把它與a[0]交換;第二趟,從a[1]開始重復(fù)前面的操作,那么最后a[1]就是剩下的n-1個元素中最小的……看a[0]、a[1]已經(jīng)由小到大排好了,當(dāng)做完n-1趟時不就把整個數(shù)組都排好了嗎?注意:t=array[k];array[k]=array[i];array[i]=t;不是for(j=i+1;j<n;j++)的循環(huán)體,要等它循環(huán)完了后才執(zhí)行一次。
以上就是關(guān)于選擇排序算法相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
為何需要專業(yè)的運營團隊做抖音政務(wù)賬號代運營?選擇抖音政務(wù)賬號代運營有什么好處?
景觀設(shè)計的領(lǐng)域感分析(景觀設(shè)計區(qū)域)
問大家
如何去選擇濟南正規(guī)、靠譜的單身找對象交友平臺?哪家口碑好呢?
朝陽舞龍舞獅舞龍舞獅怎么選擇才不吃虧?路過的前輩們幫忙答一下
濟南專業(yè)正規(guī)的婚戀所?誠信的婚介所?選擇哪家比較好?
為什么說自媒體視頻大V,大多數(shù)人最后都會選擇直播帶貨?
昌平喬遷慶典辦公會議場地出租怎么選擇才不吃虧?各位大佬們問一下哈
永春值得選擇的公眾號設(shè)計制作近期什么價格?諸位老司機們幫忙回一下
霍邱網(wǎng)頁美工設(shè)計該如何選擇?路過的大哥大姐們有誰了解
濟南口碑好的濟南公益相親網(wǎng)?選擇哪家相親婚介網(wǎng)比較好?
吳江值得選擇的小程序開發(fā)正規(guī)價多少錢?大仙們你們誰明白
山東省濟南市最專業(yè)正規(guī)的婚姻介紹公司是哪個?哪個好點?