最簡單清晰的理解《快速排序》


作為程序員理解算法是非常重要的,最近又在看快速排序的實現細節,做了一些總結。

快速排序是一種經典的遞歸和分而治之的思想

 

一、從一組無序的數據分而治之,從中任意選擇一個數據作為基准數據MARK,數組中大於MARK的數據放到MARK的右邊存入數組max中,小於MARK的放到MARK的左邊存入數組min中;

二、對於max數組和min數組繼續步驟一的操作,直到數組中只有一個元素為止(遞歸);

 

快速排序的時間復雜度為:n*logn

 

        概念就是這么簡單,但是為什么會給我們一種很復雜的錯覺呢,就我個人而言覺得原因在於,我們經常看到的是快速排序的實現代碼(java,c#,c,c++)。我這里不進行列舉,網上有大把的實例。我在這里想說的是,恰恰是這些實現的代碼加大了理解快速排序的難度,我們很多的時間用在了理解代碼上,而不是理解算法本身上。所以,在我看來,算法和算法的實現代碼不應該混在一起。而且在我看來,最能清晰的表達出快速排序的實現代碼是。python,如果你有編程經驗,即使不會python,也基本可以輕松理解下面的代碼:

def quicksort(array):
if len(array) < 2:
return array
else:
pivot = array[0]         //基准數據MARK
less = [i for i in array[1:] if i <= pivot]     //小於MARK的數組
greater = [i for i in array[1:] if i > pivot]   //大於MARK的數組

return quicksort(less) + [pivot] + quicksort(greater) //遞歸
print quicksort([10, 5, 2, 3])

     這段代碼的重點在於遞歸的清晰表達上,數組和數組直接用加號就可以進行合並,貌似其它語言不行,行雲流水的就把意思表達的很清楚。有興趣的同學可以去找找其它語言的實現代碼進行對比。也可以看出為什么python目前相當火爆,好的語言在表達上應該清晰。這里我不是推廣python,實際上我自己並不會python。

        作為一個c#和java的開發者,我當然也想在自己熟悉的領域中找到很簡單直觀的代碼來進行反駁,但是很遺憾我還沒有找到。然后我從時間復雜度上做文章,大家重點看分而治之這個詞,有了分而治之才有了快速排序的基礎,所以我給出了c#的快速排序的實現代碼:

        static void Main(string[] args)
        {
            List<int> list = new List<int>() { 3, 2, 4, 1 ,1,4};
            List<int> result = new List<int>();
            int size = list.Count;
            for (int i = 0; i < size; i++)
            {
                int min = findMin(list);
                result.Add(min);
                list.Remove(min);
            }
            foreach (var item in result)
            {
                Console.WriteLine(item);
            }
        }

        public static int findMin(List<int> parm)
        {
            List<int> lessList = new List<int>();
            if (parm.Count > 1)
            {
                int index = parm[0];
                foreach (var item in parm)
                {
                    if (item < index)
                    {
                        lessList.Add(item);
                    }
                }
                if (lessList.Count == 0)
                {
                    return index;
                }
                else
                {
                    return findMin(lessList);
                }
            }
            else
            {
                return parm[0] ;
            }
        }

     我的理解在於,如何通過分而治之快速查找的依次找到最值。實際上分而治之類似於二分查找。從一組數據中通過分而治之找到最值使用的復雜度是logn,然后總的時間復雜度也是n*logn。在這個快速排序的實現代碼中,代碼清晰,算法思想明確,即使看起來還是沒有python簡潔,但是清晰表達的目的是達到了,歡迎大家指教!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM