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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

插入排序(含希尔排序)的C/C++实现

發(fā)布時(shí)間:2025/4/5 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 插入排序(含希尔排序)的C/C++实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

直接插入排序

直接貼核心代碼

for(i=1;i<n;i++)//n為數(shù)組長(zhǎng)度{t=a[i];//取出待比較元素for(j=i-1;j>=0&&a[j]>t;j--)//在此元素比前數(shù)大的情況下進(jìn)入循環(huán){a[j+1]=a[j];//前面的元素后移}a[j+1]=t;//確定位置,將取出的元素插入}

以上就是整個(gè)直接插入排序的核心部分,其中t是用來(lái)暫存取出的元素。此法時(shí)間復(fù)雜度O(n^2)。

二分插入排序

其實(shí)二分插入排序在已經(jīng)會(huì)了直接插入排序的基礎(chǔ)上十分簡(jiǎn)單,只需要在你取出元素后對(duì)其進(jìn)行二分法判斷,直到找到插入位置,下面放核心代碼

for(i=1;i<n;i++)//n為數(shù)組長(zhǎng)度{t=a[i];//取出待比較元素int left=0;//定義左邊界int right=i-1;//定義右邊界,所以有序區(qū)間為[0,i-1]while(left<=right)//在有序區(qū)間進(jìn)行折半查找,找到插入位置{int mid=(right+left)/2;//先取有序區(qū)間中間值if(t<a[mid])//如果取出元素小于中間值,右邊界縮小,總之就是二分法的原理,讀者應(yīng)該能理解{right =mid-1;}else{left = mid+1;}}//通過這里的循環(huán),已經(jīng)找到了插入位置for(j=i-1;j>=left;j--)//這一步就是移動(dòng)元素,騰出插入位置{a[j+1]=a[j];}a[left]=t;//將元素插入}

以上就是二分插入排序的核心代碼,其實(shí)就是在直接插入的基礎(chǔ)上,用了二分法去判斷元素的插入位置。此法時(shí)間復(fù)雜度最好時(shí)O(nlog2n),最壞時(shí)O(n^2),所以比起直接插入排序是有一定優(yōu)勢(shì)的。

希爾排序

當(dāng)數(shù)據(jù)量很大,并且有序程度很低時(shí),上面兩種方法的時(shí)間復(fù)雜度很高,這時(shí)就可以采用希爾排序,其時(shí)間復(fù)雜度為O(n^(1.3—2))。
其實(shí)希爾排序不難理解,就是先對(duì)數(shù)據(jù)進(jìn)行的分組排序,讓數(shù)據(jù)變的整體有序,在此基礎(chǔ)上,最終進(jìn)行直接插入排序,下面直接放核心代碼部分

for(gap=n/2;gap>0;gap/=2)//n為數(shù)組長(zhǎng)度,等長(zhǎng)(gap)取子序列排序,最終取長(zhǎng)度為1,則進(jìn)行正常的插入排序{for(i=gap;i<n;i+=gap)//對(duì)子序列進(jìn)行插入排序{t=a[i]; //看到?jīng)],其實(shí)整個(gè)代碼和直接插入排序差別不大,只是將for(j=i-gap;j>=0&&a[j]>t;j-=gap) //直接插入排序里的1換成了這里的長(zhǎng)度(gap),其他地方{ //都一模一樣,只有能掌握直接插入排序就能掌握希爾排序a[j+gap]=a[j];}a[j+gap]=t; }}

相信讀者應(yīng)該能夠理解到這三種排序的區(qū)別與聯(lián)系了,快去自己實(shí)現(xiàn)試試吧!

總結(jié)

以上是生活随笔為你收集整理的插入排序(含希尔排序)的C/C++实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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