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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

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

冒泡排序

  • 冒泡排序 思想

    這個方法就是在每一趟的循環(huán)中依次比較前后兩個元素之間的大小,然后進(jìn)行一個交換。這樣在多趟循環(huán)中實(shí)現(xiàn)無序數(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ù)雜度分析

    從上面的代碼可以看出來,外層循環(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ù)的無序的,那么有可能就不需要比較那么多趟去實(shí)現(xiàn)這個冒泡,因此,可以設(shè)置一個旗幟變量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

這里就有一個旗幟變量,進(jìn)行一個統(tǒng)計(jì)是否發(fā)生了元素交換。這樣的當(dāng)一個序列里面大部分有序,只有少數(shù)無序的時(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)

插入排序

  • 插入排序的思想

    插入排序是在一個已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個元素。當(dāng)然,剛開始這個有序的小序列只有1個元素,就是第一個元素。比較是從有序序列的末尾開始,也就是想要插入的元素和已經(jīng)有序的最大者開始比起,如果比它大則直接插入在其后面,否則一直往前找直到找到它該插入的位置。如果碰見一個和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后順序沒有改變,從原無序序列出去的順序就是排好序后的順序,所以插入排序是穩(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; %記錄這個位置temp=a(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

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

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

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

    T(n)=1+2+3+?+(n?1)=n(n?1)2,也就是說其算法時(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)

簡單選擇排序

  • 簡單選擇排序思想

    在要排序的一組數(shù)中,選出最小(或者最大)的一個數(shù)與第1個位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最小(或者最大)的與第2個位置的數(shù)交換,依次類推,直到第n-1個元素(倒數(shù)第二個數(shù))和第n個元素(最后一個數(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,也就是說其算法時(shí)間復(fù)雜度為 O(n2) 。

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

總結(jié)

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

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