算法之快速排序(遞歸實現(xiàn))

什么是遞歸函數(shù)呢?
在函數(shù)內部,可以調用其他函數(shù)。如果一個函數(shù)在內部調用自身本身,這個函數(shù)就是遞歸函數(shù)。

編寫遞歸函數(shù)時,必須告訴它何時停止遞歸。正因為如此,每個遞歸
函數(shù)都有兩部分:基線條件 (base case)和遞歸條件 (recursive
case)。遞歸條件指的是函數(shù)調用自己,而基線條件則指的是函數(shù)不再
調用自己,從而避免形成無限循環(huán)。

def countdown(i):
    '''遞歸舉例方法'''
    print (i)
    if(i<=0):  #-------------------------------------------基線條件
        print("函數(shù)執(zhí)行完成")
        return
    else:    #----------------------------------------------遞歸條件
         i=i-1
        countdown(i)

快速排序
排序一個數(shù)組arry1=[4,6,3,5,2],從大到小排列數(shù)組中的元素值

思路:
通過一趟排序將要排序的數(shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列。

image.png
  • 1
    首先,從數(shù)組中選擇一個元素,這個元素被稱為基準值
    暫時將數(shù)組的第一個元素用作基準值。


    image.png
  • 2
    4作為基準值,以4為基準,把原始數(shù)組arry1分成兩部分數(shù)組,
    arry2:比4小的部分
    arry3:比4大的部分


    image.png

    -3 在數(shù)組arry2中以第一個元素作為基準值


    image.png

    --3.1
    arry2分成兩部分,比3小的一部分arry21,與比3大的一部分arry22
    這時arry21與arry22中的元素都不超過1個了,不用往下再分
    image.png

    --3.2arry2中完成排序
    image.png

    --4同理在arry3中以以第一個元素作為基準值


    image.png

--4.1
arry3分成兩部分,比6小的一部分arry31,與比6大的一部分arry32
這時arry31與arry32中的元素都不超過1個了,不用往下再分


image.png

--4.2arry3中完成排序


image.png

-5把集合arry2 基準值4 數(shù)組arry3組合起來,完成對原始數(shù)組的排序


image.png
image.png

完整代碼:

  • C#
   #region 快速排序
        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="Arrylist">要排序的集合</param>
        /// <returns></returns>
        public static List<int> KuaiPaiMethod(List<int> Arrylist)
        {
           
            if (Arrylist.Count < 2)
            {
                return Arrylist;
            }
            //比基準值小的數(shù)據(jù)集合
            List<int> MinArry = new List<int>();
            //比基準值大的數(shù)據(jù)集合
            List<int> MaxArry = new List<int>();
            int label_value = Arrylist[0];//比較基準值
            for (int i = 1; i < Arrylist.Count; i++)
            {
                if (Arrylist[i] <= label_value)
                {
                    MinArry.Add(Arrylist[i]);
                }
                else
                {
                    MaxArry.Add(Arrylist[i]);
                }
            }          
            var result = KuaiPaiMethod(MinArry);
            var MaxSum = KuaiPaiMethod(MaxArry);
            result.Add(label_value);
            result.AddRange(MaxSum);
            return result;
        }
    #endregion
  • Python
def KuaiPai(arry):
    '''快速排序(從小到大)'''
    if len(arry)<2:
        return arry
    else:
        lable_num=arry[0]#基準值
        min_arry=[]
        max_arry=[]
        for x in arry[1:]:
            if  x<=lable_num:
                min_arry.append(x)
            else:
                max_arry.append(x)
    #把幾個數(shù)組直接相加,合并為一個數(shù)組
    return KuaiPai(min_arry)+[lable_num]+KuaiPai(max_arry)

image.png
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容