日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现

發(fā)布時(shí)間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在學(xué)習(xí)排序算法的一些知識(shí)。還是比較有趣的。所以好好研究了一下各個(gè)算法。并且使用matlab進(jìn)行了個(gè)基本的實(shí)現(xiàn),目前僅僅是實(shí)現(xiàn)吧,優(yōu)化什么的可能目前的水平達(dá)不到吧,畢竟是用matlab實(shí)現(xiàn),還是比較簡(jiǎn)單。以后還是希望使用C/C++,或者python來(lái)實(shí)現(xiàn)一下。先本著學(xué)習(xí)算法思想的原則,用matlab搞一搞吧。

冒泡排序

  • 冒泡排序 思想

    這個(gè)方法就是在每一趟的循環(huán)中依次比較前后兩個(gè)元素之間的大小,然后進(jìn)行一個(gè)交換。這樣在多趟循環(huán)中實(shí)現(xiàn)無(wú)序數(shù)列的有序排列。下面是使用matlab實(shí)現(xiàn)的

clc clear close% aa=round(rand(1,100000)*500000000) ;%產(chǎn)生隨機(jī)數(shù)組 % a=aa; a=[0 6,5,3,1,8,7,2,4]; N=size(a,2); for i=1:N for j=1:N-iif a(1,j)>a(1,j+1)temp=a(1,j);a(1,j)=a(1,j+1);a(1,j+1)=temp;endend end
  • 算法時(shí)間復(fù)雜度分析

    從上面的代碼可以看出來(lái),外層循環(huán)也就是趟數(shù)最多為N?1次,而內(nèi)層循環(huán)比較次數(shù)最多為N次,最少為1次,所以平均

    次數(shù)為N+12次,所以總的次數(shù)為T(n)=(N?1)×N+12=N2?12次,所以其算法時(shí)間復(fù)雜 度為O(n2).

  • 冒泡改進(jìn)
    有時(shí)候碰到的序列里面有大部分是有序,只有少數(shù)的無(wú)序的,那么有可能就不需要比較那么多趟去實(shí)現(xiàn)這個(gè)冒泡,因此,可以設(shè)置一個(gè)旗幟變量exchangeFlag,發(fā)生元素交換了,則exchangeFlag=1,否則為0.
    那么改進(jìn)之后的代碼為:

exchangeFlag=true; tic for i=1:m exchangeFlag=0for j=1:m-iif a(1,j)>a(1,j+1)temp=a(1,j);a(1,j)=a(1,j+1);a(1,j+1)=temp;exchangeFlag=1endendif ~exchangeFlagbreak;end end

這里就有一個(gè)旗幟變量,進(jìn)行一個(gè)統(tǒng)計(jì)是否發(fā)生了元素交換。這樣的當(dāng)一個(gè)序列里面大部分有序,只有少數(shù)無(wú)序的時(shí)候就比較使用,不要去試行N?1趟的比較了。

  • Python 實(shí)現(xiàn)
for i in range(0,m):exchangeFlag=0for j in range(0,m-i-1):if a[j]>a[j+1]:a[j],a[j+1]=a[j+1],a[j]exchangeFlag=1if ~exchangeFlag:break print(a)

插入排序

  • 插入排序的思想

    插入排序是在一個(gè)已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個(gè)元素。當(dāng)然,剛開(kāi)始這個(gè)有序的小序列只有1個(gè)元素,就是第一個(gè)元素。比較是從有序序列的末尾開(kāi)始,也就是想要插入的元素和已經(jīng)有序的最大者開(kāi)始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見(jiàn)一個(gè)和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒(méi)有改變,從原無(wú)序序列出去的順序就是排好序后的順序,所以插入排序是穩(wěn)定的。

  • matlab代碼

clc clear close all a=[6 5 3 1 8 7 2 4 -1]; m=size(a,2); tic for i=2:mif a(1,i)<a(1,i-1)j=i-1; %記錄這個(gè)位置temp=a(i); %將這個(gè)位置的元素值取出來(lái)a(i)=a(i-1); %將大的元素后移while (j-1)>0 %這里實(shí)現(xiàn)待插入的元素和已排好序列進(jìn)行比較if temp<a(j-1)a(j)=a(j-1);elsebreak;endj=j-1;enda(j)=temp;end end toc

測(cè)試輸出結(jié)果為:

-1 1 2 3 4 5 6 7 8
  • 算法時(shí)間復(fù)雜度分析

    對(duì)于第i個(gè)元素來(lái)說(shuō),其需要比較的次數(shù)為 i?1 次,那么對(duì)于有N個(gè)元素的序列來(lái)說(shuō),最壞的情況下,其需要的次數(shù)為

    T(n)=1+2+3+?+(n?1)=n(n?1)2,也就是說(shuō)其算法時(shí)間復(fù)雜度為 O(n2)

  • python實(shí)現(xiàn)

a=[6,5,3,1,8,7,2,4] m=a.__len__() for i in range(1,m):if a[i]<a[i-1]:j=i-1temp=a[i]a[i]=a[i-1]while (j-1)>=0:if temp<a[j-1]:a[j]=a[j-1]else:breakj=j-1a[j]=temp print(a)

簡(jiǎn)單選擇排序

  • 簡(jiǎn)單選擇排序思想

    在要排序的一組數(shù)中,選出最小(或者最大)的一個(gè)數(shù)與第1個(gè)位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小(或者最大)的與第2個(gè)位置的數(shù)交換,依次類(lèi)推,直到第n-1個(gè)元素(倒數(shù)第二個(gè)數(shù))和第n個(gè)元素(最后一個(gè)數(shù))比較為止。

  • matlab代碼實(shí)現(xiàn)

a=[6 5 3 1 8 7 2 4]; m=size(a,2); for i=1:mminValue=min(a(1,i:end)); %找到剩余序列的最大值minValueIndex=find(a(1,i:end)==min(a(1,i:end)))+i-1; %找到剩余序列最大值所在原序列中的索引值a(1,minValueIndex)=a(i); %交換a(i)=minValue; end
  • 算法時(shí)間復(fù)雜度分析

    第一趟,需要比較 N?1 次,第二趟需要比較 N?2 次,?,第 N?1 次需要比較1次就可以了。因此總的比較次數(shù)

    為:T(n)=1+2+3+?+(n?1)=n(n?1)2,也就是說(shuō)其算法時(shí)間復(fù)雜度為 O(n2)

今天就先學(xué)些到這,后續(xù)繼續(xù)學(xué)習(xí)補(bǔ)充,希望大神路過(guò)指點(diǎn)。

總結(jié)

以上是生活随笔為你收集整理的排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。