關(guān)于冒泡排序的簡(jiǎn)單優(yōu)化

一說(shuō)到冒泡排序,學(xué)過(guò)C語(yǔ)言的人都不會(huì)陌生.冒泡排序一個(gè)簡(jiǎn)單易懂的排序方法,使我們很好的掌握了兩層for循環(huán)的用法.

一般的來(lái)說(shuō),對(duì)一個(gè)數(shù)組 int array[5] = [12, 2, 33, 25, 6];進(jìn)行簡(jiǎn)單的排序,大家也都會(huì)想到冒泡排序.就會(huì)迅速的在編譯器上敲下已經(jīng)爛熟于心的冒泡排序代碼:(如下:)

for (int i = 0 ; i < 5 - 1; i++) {

????? for (int j = 0; j < 5- 1 - i; j++) {

????????????? if (array[j] > array[j + 1]) {

????????????????????? array[j] = array[j] ^ array[j + 1];

????????????????????? array[j + 1] = array[j] ^ array[j + 1];

????????????????????? array[j] = array[j] ^ array[j + 1];

???????????? }

?????? }

}

上面的代碼已經(jīng)對(duì)冒泡排序進(jìn)行了實(shí)現(xiàn).另外在交換兩個(gè)變量的時(shí)候,用^(異或)來(lái)交換兩個(gè)變量的值,這種方法逼格很高.(推薦使用)

現(xiàn)在問(wèn)題來(lái)了:假如說(shuō)給你一個(gè)數(shù)組,數(shù)組里面的元素大部分已經(jīng)是有序的,int array[5]={23, 32, 7, 4, 2}; 這樣的話,我用上面的冒泡排序?qū)?shù)組array進(jìn)行降序的話,還是會(huì)進(jìn)行一一比較確定是否交換.那么我們?cè)撊绾胃倪M(jìn)冒泡排序,使它知道后面有序的情況下,就不在繼續(xù)for循環(huán)?

我們?cè)撊绾沃罃?shù)組array后面的是否有序?通過(guò)for循環(huán),我們需要前后兩個(gè)數(shù)一次比較,如果滿足某個(gè)要求(降序或升序)這樣的話,我們才能對(duì)這兩個(gè)數(shù)進(jìn)行交換.如果沒(méi)有進(jìn)行交換,則說(shuō)明這兩個(gè)數(shù)是有序的(這兩個(gè)數(shù)按照降序或者升序排列), 如果循環(huán)到最后依舊沒(méi)有交換過(guò),則說(shuō)明后面的數(shù)都是有序的.

因此,我們需要定義一個(gè)布爾類(lèi)型的變量來(lái)記錄,循環(huán)中相比較的兩個(gè)數(shù)是否進(jìn)行了交換.實(shí)現(xiàn)代碼如下:

BOOL isNeedNext = YES;//定義BOOL值決定是否需要下一趟比較

for(inti =0; i < 5 -1&& isNeedNext; i++) {

??????? //每趟開(kāi)始假定不需要下一趟比較

??????? isNeedNext =NO;

??????? for(intj =0; j < 5 -1- i ; j++) {

? ? ? ? ? ? ? if(array[j] > array[j + 1]) {

???????????????? //如果發(fā)生交換,說(shuō)明還是亂序,需要下一趟

??????????????? isNeedNext =YES;

? ? ? ? ? ? ? array[j] = array[j] ^ array[j + 1];

????????????? array[j + 1] = array[j] ^ array[j + 1];

????????????? array[j] = array[j] ^ array[j + 1];

?????? ? ?? }

????? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 總結(jié)一下常見(jiàn)的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,514評(píng)論 0 1
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,899評(píng)論 0 33
  • 青葉不相信。 他們?cè)缍妓懒恕?什么時(shí)候? 他們開(kāi)始?jí)櫬涞臅r(shí)候。 為什么我沒(méi)死? 因?yàn)槟氵€在上學(xué)。 因?yàn)槲疑蠈W(xué)? 上...
    我是大水溝閱讀 178評(píng)論 0 0
  • 喜歡 能看見(jiàn)遠(yuǎn)山的陽(yáng)臺(tái) 洗滌過(guò)的衣物 清清爽爽的透進(jìn)陽(yáng)光和秋風(fēng)來(lái) ——秋日物語(yǔ)
    愛(ài)瞎寫(xiě)的MIAO閱讀 225評(píng)論 0 0
  • 對(duì)于一個(gè)只堅(jiān)持了兩天的短時(shí)跑步外加仰臥起坐的我來(lái)說(shuō),這個(gè)題目未免選的太過(guò)不自量力了,不過(guò),就這兩天里有限的運(yùn)動(dòng)時(shí)間...
    尚巾林閱讀 488評(píng)論 3 0

友情鏈接更多精彩內(nèi)容