1. 程式人生 > >排序演算法的穩定性及其意義

排序演算法的穩定性及其意義

穩定性的定義

      假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。

判斷方法

 

對於不穩定的排序演算法,只要舉出一個例項,即可說明它的不穩定性;而對於穩定的排序演算法,必須對演算法進行分析從而得到穩定的特性。需要注意的是,排序演算法是否為穩定的是由具體演算法決定的,不穩定的演算法在某種條件下可以變為穩定的演算法,而穩定的演算法在某種條件下也可以變為不穩定的演算法。例如,對於如下氣泡排序演算法,原本是穩定的排序演算法,如果將記錄交換的條件改成a[j].key>=a[j+1].key,則兩個相等的記錄就會交換位置。

void BubbleSort(DataType a[], int n)

{ 
        int i, j, flag = 1;

        DataType temp;

        for(i = 1; i < n && flag == 1; i++)

        { 
            flag = 0;

            for(j = 0; j < n-i; j++)

            { 
                if(a[j].key >a[j+1].key)
                {             
                                  /*如果改為a[j].key >=a[j+1].key,就不穩定咯*/

                    flag = 1;
    
                    temp = a[j];

                    a[j] = a[j+1];

                    a[j+1] = temp; 
                }

            }

        }

}    

常見演算法的穩定性(要記住)

堆排序快速排序希爾排序直接選擇排序不是穩定的排序演算法,而基數排序氣泡排序直接插入排序折半插入排序歸併排序是穩定的排序演算法。

穩定性的意義

1、如果只是簡單的進行數字的排序,那麼穩定性將毫無意義。
2、如果排序的內容僅僅是一個複雜物件的某一個數字屬性,那麼穩定性依舊將毫無意義(所謂的交換操作的開銷已經算在演算法的開銷內了,如果嫌棄這種開銷,不如換演算法好了?)
3、如果要排序的內容是一個複雜物件的多個數字屬性,但是其原本的初始順序毫無意義,那麼穩定性依舊將毫無意義。
4、除非要排序的內容是一個複雜物件的多個數字屬性,且其原本的初始順序存在意義,那麼我們需要在二次排序的基礎上保持原有排序的意義,才需要使用到穩定性的演算法,例如要排序的內容是一組原本按照價格高低排序的物件,如今需要按照銷量高低排序,使用穩定性演算法,可以使得想同銷量的物件依舊保持著價格高低的排序展現,只有銷量不同的才會重新排序。(當然,如果需求不需要保持初始的排序意義,那麼使用穩定性演算法依舊將毫無意義)。

      G M T    
檢測語言世界語中文簡體中文繁體丹麥語烏克蘭語烏茲別克語烏爾都語亞美尼亞語伊博語俄語保加利亞語信德語修納語僧伽羅語克羅埃西亞語冰島語加利西亞語加泰羅尼亞語匈牙利語南非祖魯語卡納達語盧森堡語印地語印尼巽他語印尼爪哇語印尼語古吉拉特語吉爾吉斯語哈薩克語土耳其語塔吉克語塞爾維亞語塞索托語夏威夷語威爾士語孟加拉語宿務語尼泊爾語巴斯克語布林語(南非荷蘭語)希伯來語希臘語庫爾德語弗裡西語德語義大利語意第緒語拉丁語拉脫維亞語挪威語捷克語斯洛伐克語斯洛維尼亞語斯瓦希里語旁遮普語日語普什圖語喬治亞語毛利語法語波蘭語波斯尼亞語波斯語泰盧固語泰米爾語泰語海地克里奧爾語愛爾蘭語愛沙尼亞語瑞典語白俄羅斯語科薩科西嘉語立陶宛語索馬利亞語約魯巴語緬甸語羅馬尼亞語寮國語芬蘭語蘇格蘭蓋爾語苗語英語荷蘭語菲律賓語薩摩亞語葡萄牙語蒙古語西班牙語豪薩語越南語亞塞拜然語阿姆哈拉語阿爾巴尼亞語阿拉伯語韓語馬其頓語馬爾加什語馬拉地語馬拉雅拉姆語馬來語馬耳他語高棉語齊切瓦語   世界語中文簡體中文繁體丹麥語烏克蘭語烏茲別克語烏爾都語亞美尼亞語伊博語俄語保加利亞語信德語修納語僧伽羅語克羅埃西亞語冰島語加利西亞語加泰羅尼亞語匈牙利語南非祖魯語卡納達語盧森堡語印地語印尼巽他語印尼爪哇語印尼語古吉拉特語吉爾吉斯語哈薩克語土耳其語塔吉克語塞爾維亞語塞索托語夏威夷語威爾士語孟加拉語宿務語尼泊爾語巴斯克語布林語(南非荷蘭語)希伯來語希臘語庫爾德語弗裡西語德語義大利語意第緒語拉丁語拉脫維亞語挪威語捷克語斯洛伐克語斯洛維尼亞語斯瓦希里語旁遮普語日語普什圖語喬治亞語毛利語法語波蘭語波斯尼亞語波斯語泰盧固語泰米爾語泰語海地克里奧爾語愛爾蘭語愛沙尼亞語瑞典語白俄羅斯語科薩科西嘉語立陶宛語索馬利亞語約魯巴語緬甸語羅馬尼亞語寮國語芬蘭語蘇格蘭蓋爾語苗語英語荷蘭語菲律賓語薩摩亞語葡萄牙語蒙古語西班牙語豪薩語越南語亞塞拜然語阿姆哈拉語阿爾巴尼亞語阿拉伯語韓語馬其頓語馬爾加什語馬拉地語馬拉雅拉姆語馬來語馬耳他語高棉語齊切瓦語            
      文字轉語音功能僅限200個字元  
  選項 : 歷史 : 反饋 : Donate 關閉