c 實現最簡快速排序,你絕對可以看懂

2022-02-23 23:13:15 字數 2487 閱讀 1826

演算法對於程式設計師的重要性不言而喻,今天我和大家分享演算法中的乙個基礎演算法,快速排序。作為一名程式設計師,相信大家都不陌生,但是要大家徒手一次性寫出來,我估計還是有難度的。那麼廢話不多少,我先簡單減少一下概念。

快速排序演算法說明:

原始陣列l1,從中任意選擇乙個基準數f(一般選擇第1個),小於f的資料放在f的左邊記為陣列minlist,大於f的資料放在f的右邊記為陣列maxlist。那麼

l1=minlist+f+maxlist

然後對minlist和maxlist再做這樣的操作,直到minlist和maxlist中的元素個數為1或者0的時候停止

一、c#網上目前最簡潔的實現方式:

現在就是要進行演算法的實現了,很明顯,這裡要用到乙個叫遞迴的思想。我們知道程式語言知識工具,演算法才是核心,但是不同的程式語言實現演算法卻有很大的不同(簡潔程度)。目前網上對於c#的實現快速排序的方式有很多,簡單查閱了一下,發現一般都要100行**左右(c和c++的**行數要少一些)。千找萬找,終於找到了乙個,貼出如下:

static

void quicksort(ref list nums, int left, int

right)

;while (j > 0 && nums[j] > middle) ;

if (i == j) break

;

int temp =nums[i];

nums[i] =nums[j];

nums[j] =temp;

if (nums[i] == nums[j]) j--;

}quicksort(

refnums, left, i);

quicksort(

ref nums, i + 1

, right);

}}

但是說真的,很難讀懂,真要在考場上寫出這個**,難保能一次寫對。

二、python的實現方式:

python我也有接觸,所以當我用python寫出這個演算法的**的時候,真的有種感覺,真是太tm簡單了吧,有程式設計經驗的同學應該也能看懂下面的python**

def

quicksort(array):   

if len(array) < 2:     

return array  ------基線條件:為空或只包含乙個元素的陣列是「有序」的   

else

:     

pivot = array[0]  ------遞迴條件

less = [i for i in array[1:] if i <= pivot]  ------由所有小於基準值的元素組成的子陣列     

greater = [i for i in array[1:] if i > pivot]  ------由所有大於基準值的元素組成的子陣列     

return quicksort(less) + [pivot] +quicksort(greater)

print quicksort([10, 5, 2, 3])

短短幾行**,清晰明了。主要的**就是陣列可以直接相加運算:quicksort(less) + [pivot] + quicksort(greater) 

三、c#自己實現最簡易方式

那難道我們c#就只能寫出難懂又多的**才能實現嗎?終於讓我也找到了,下面貼出我自己寫的c#**:

public

class extend :list

}static

extend quicksort2(extend nums)

else

return quicksort2(minlist) + new extend() +quicksort2(maxlist);//遞迴,並且使用+運算子

}}

實際上就只有兩步操作,就實現了和python一樣的簡潔!

第一:新建乙個extend 類繼承於list

第二:重寫了+運算子

有同學對extend類中的addrange方法提出了記憶體上的質疑,我也進行了回覆,演算法是對時間複雜度的考察,也就是對過程的考察。記憶體消耗根據不同的**肯定會有所不同,但是不影響演算法。當然我也對extend進行了改進,因為實際上最終的加法運算中,minlist和maxlist都只有乙個元素,或者沒有元素。

public

class extend :list

}

其餘的和python的**基本一致,**清晰明了。

據我觀察,c#通過我這種方式實現的,目前獨此乙份,收好不謝!最後我還是要吐槽一句,怪不得python現在這麼火,**真的簡單。但是最為程式設計師,我們始終要記住,語言只是工具,我們才是語言的主宰。了解**背後的思想才是王道!

C快速排序 思想 原理與實現 簡筆

快速排序是很常用的排序方法,它的時間複雜度較理想,平均時間複雜度為o nlogn 注 最壞情況下時間複雜度與氣泡排序相同,都是o n 快速排序的本質是二分思想 將一系列數按照某個基準,分為大於它的數和小於它的數,將這兩組數分出來後,再用遞迴的思想使用相同的一段 再次分數,直到最後完成排序。選擇乙個基...

可能是你最容易看明白的快速排序(C 實現)

我認為現在csdn大多關於快速排序的程式都是在扯淡。不是針對某一位,我是說,我看到csdn的c 快排程式都是扯淡。他們根本沒有把重點放在快速排序本身,為什麼我這麼說?我們往下看。快排的本質思想就是分而治之。舉例說明,我們要對3 5 2 1 4進行排序。首先我們選中乙個數字當做是pivot,就是支點啦...

排序 快速排序,C 實現

本文 的github位址 基本思想 快速排序 是對 氣泡排序 的改進。基本原理 基於分治法,在待排線性表中取乙個元素pivot作為樞軸值,通過一趟排序將待排線性表劃分為獨立的兩部分,第一部分的所有元素小於pivot,第二部分的所有元素大於等於pivot,pivot位於其最終位置。遞迴對兩個子表做快速...