快速排序看了解釋還是不會求通俗點的

2022-03-04 12:06:05 字數 5006 閱讀 1861

1樓:

快速排序簡單的說就是選擇一個基準,將比起大的數放在一邊,小的數放到另一邊。對這個數的兩邊再遞迴上述方法。

如本題66  13  51  76  81  26  57  69  23,以66為基準,升序排序的話,比66小的放左邊,比66大的放右邊, 類似這種情況  13  。。。   66。。。69

具體快速排序的規則一般如下:

從右邊開始查詢比66小的數,找到的時候先等一下,再從左邊開始找比66大的數,將這兩個數借助66互換一下位置,繼續這個過程直到兩次查詢過程碰頭。

例子中:

66  13  51  76  81  26  57  69  23

從右邊找到23比66小,互換

23  13  51  76  81  26  57  69  66

從左邊找到76比66大,互換

23  13  51  66  81  26  57  69  76

繼續從右邊找到57比66小,互換

23  13  51  57  81  26  66  69  76

從左邊查詢,81比66大,互換

23  13  51  57  66  26  81  69  76

從右邊開始查詢26比66小,互換

23  13  51  57  26  66  81  69  76

從左邊開始查詢,發現已經跟右邊查詢碰頭了,結束,第一堂排序結束

下面排序c語言的排序快速**,參考一下

void sort(int *a, int left, int right)

int i = left;

int j = right;

int key = a[left];

while(i < j)                               /*控制在當組內尋找一遍*/

a[i] = a[j];

/*找到一個這樣的數後就把它賦給前面的被拿走的i的值(如果第一次迴圈且key是

a[left],那麼就是給key)*/

while(i < j && key >= a[i])

/*這是i在當組內向前尋找,同上,不過注意與key的大小關係停止迴圈和上面相反,

因為排序思想是把數往兩邊扔,所以左右兩邊的數大小與key的關係相反*/

a[j] = a[i];

}a[i] = key;/*當在當組內找完一遍以後就把中間數key迴歸*/

sort(a, left, i - 1);/*最後用同樣的方式對分出來的左邊的小組進行同上的做法*/

sort(a, i + 1, right);/*用同樣的方式對分出來的右邊的小組進行同上的做法*/

/*當然最後可能會出現很多分左右,直到每一組的i = j 為止*/}

2樓:秦柔殤

我剛看了一下啊哈演算法中的快速排序

為什麼我推演的結果都沒有答案。

具體思想是,選中最左邊為基準數,即66.然後設定一個哨兵從右邊開始,尋找比66小的數,接著設定另一個哨兵,再從左邊找比66大的書,交換雙方位置,如果最後兩邊的哨兵相遇,就和基準數交換。下面開始推演:

例子:66 13 51 76 81 26 57 69 23

右邊開始:找到了23,左邊找到了76,交換:66 13 51 23 81 26 57 69 76

右邊開始:找到了57,左邊找到了81,交換:66 13 51 23 57 26 81 69 76

右邊開始:找到了26,左邊在26與哨兵相遇,交換基準數:26 13 51 23 57 66 81 69 76.

然後沒有答案啊。。。。

我好迷啊。

3樓:小旋風_阿炳

沒人發下答案不是a嗎,我推演出來是c

看了很多書,但還是沒有明白快速排序的原理?哪位大俠幫幫我用通俗的語言解釋快速排序的原理?

4樓:匿名使用者

快速排序的基本原理就是每一次把一個值放到它應該的位置上,然後序列被分為兩部分,這個數前一部分後一部分,再對這兩部分分別進行快速排序即可。

比較過程的話,遵循前後前後這樣交叉比較,有利於減少位置替換次數。你可以試試順序比較,把比他大的都放後面比他小的都放前面,你會發現資料挪動的效率很低

5樓:

遞迴的好理解,,,,,

給你一堆數字,,,在其中任意找一個做為標準,,把比標準小的放在標準的左邊,,比標準大的放在標準的右邊,,,這就是快排的演算法,,這個演算法結束後,,一堆數變為2堆,,再對這兩堆數用這個演算法***********當某一堆就剩下一個數字的時候,,這一堆結束排序,,,

實際寫下來,方法有很多,,大致為兩類,,一個是標準的選擇為第一個或最後一個數,,,另一種標準的選擇為隨機的或任意指定的一個,,兩者在寫法上有些不一樣,,多試下及個資料,,會理解的,,,前者較為多用,,後者主要處理有序的資料,,,,

當然還有非遞迴的,,,

快速排序方法的簡單解釋

6樓:匿名使用者

快速排序的原理和實現(純白話文口述)

看看這個部落格,講的很透徹,通俗易懂,望對你有用

7樓:

快排的bai思想是(假設都是從du小到大排列):選一zhi個值作為「軸dao值」,所有小於軸值的都移動內到軸值左邊容,所有大於軸值的都移動到軸值右邊。這一步是讓數列變得較為有序

然後分別再對軸值的左邊、右邊分別進行快排,一步一步提高整個數列的有序程度,直到最後完全有序。

軸值的選取有多種方式,這裡就假設是選正中間的一個70,75,82,90,23,16,10,68選擇軸值 90,排列後得到:

70,75,82,23,16,10,68,(90)括號括起來的我表示是軸值,這裡運氣不好,軸值選中了一個最大的下面對軸值左邊排序,在選擇軸值為23:

16,10,(23),70,75,82,68再分別對16, 10 和 70,75,82,68進行排序一般快排在待排序的數字個數較少時,會選取其它排序來進行排列,比如插入排序。這裡16,10數字個數已經太少,用插入排序排成10, 16

然後對 70,75,82,68進行排序……整個排序過程就這樣

8樓:對抗a範越

最快的是二分

法(運算速度最快),最簡單的事冒泡法。

二分法為例:從專兩端選取各自草中間屬靠攏,每次排除最大的,或者最小的。這種方法在演算法上是較快的。

冒泡法就是:從[0]到[n],第一次讓[0]和後面的所有數字相比較,小的就換給[0]。第二次[1]和後面的比較小的就換給[1]………………以此類推,得出從小到大的排列了……他和沉底法是一樣的道理只不過一個向上一個向下

9樓:w與

#include

int cmp(const void*x,const void*y)int main()

;qsort(a,8,sizeof(int),cmp);

for(i=0;i<8;i++)

printf("%d\n",a[i]);

return 0;

}qsort中的

dua表示陣列名名字zhi

也是陣列第一個元素

dao的地址,8表示待排元素的個內數,sizeof(int)表示元素型別,如果是char陣列,

容就用sizeof(char),cmp是個函式,返回兩兩數的差,這樣是遞增排序,若要遞減,把cmp的return相減的兩個數調換即可

快速排序的時間複雜度為n*log n,請教一下n是代表什麼,麻煩講通俗一點,不要百度照搬

10樓:90李鵬

不知道你的數學基礎如何,我簡單描述一下。

前提定義

待陣列的元素個數為n

背景介紹

何為快速排序?是否寫過快速排序的**?至少這個你需要事先有所知道,要不然也僅僅是停留在記憶的層面,而不理解它為n*lgn的原因。

快速排序演算法:

主要分為以下三個部分

1,partittion

2,quicksort前一部分

3,quicksort後一部分

簡單說來就是,partition從要排序的陣列中選取一個樞紐,例如即為pivot,然後將陣列中比pivot小的元素放到它的左邊,將比pivot大的元素放到它的右邊(如果是遞增排序的話)。因此根據時間複雜度的概念,這個partition的時間複雜度為n,這裡的n就是你partition方法處理的資料長度。

為何partition的時間複雜度為n?

看你的問題,既然問到了n,我就解釋一下partition為什麼會是n的時間複雜度。paritition方法選取樞紐,這個一般拿陣列元素的第一個即可,這個不需要任何的迴圈操作,直接取值即可,換句話說這個時間複雜度是1,然後需要遍歷陣列,將比pivot大的元素放到右邊,比pivot小的元素放到左邊,這個至少要遍歷整個陣列,然後對每一個元素進行操作決定是否移動,處理一個元素的時間複雜度為1,現在有n個元素要處理,故而parition方法的時間複雜度為n。

為何快速排序的時間複雜度為n*lgn?

根據背景介紹中的演算法描述,可以寫出如下的遞推公式:

f(n) = 2 * f(n/2) + n

對上述函式進行解釋如下:

f(n)代表對n個元素進行排序處理所花費的時間(當然只是一個抽象的時間概念)

根據演算法描述的三步,第一步partition就是等式右邊的n,第二步和第三步中的quicksort就是等式右邊的2 * f(n/2)。為什麼是n/2 ? 這個應該很容易理解,partition將陣列分成兩部分,下面的quicksort分別排序前一部分和後一部分,此處我們假設這個拆分是完全等分的,也就是說前一部分和後一部分都是n/2。

對上述等式進行時間複雜度的運算如下:

f(n) = 2 * f(n/2) + n = 2 * ( 2 * f(n/4) + n/2 ) + n

= 4 * f(n/4) + 2 * n

希望你能看出這個推導,就是直接的代入而已,下面我不再繼續了,可以看出每一次它等式右邊就多出了一個n, 由於每次操作是進行除以2的操作,故而最多進行lgn,也就是說最終的運算結果: f(n) = k* f(1) + lgn*n。

好了,囉囉嗦嗦.

快速排序希爾排序都是什麼意思,快速排序與希爾排序哪個效率更高?

個人認為是快速排序。快速排序的最差複雜度可能會降為n 2,最快則是nlogn,但 是,平均情況下是較快的。而希爾排序的最差情況下,複雜度可能會降為n s 到n s之間,1 s 2 平均則是nlog 2n。理論上來看,希爾排序可能是效率比較高的。但是,實際情況來看,快速排序的實際效果很不錯。原因就是,...

求解答 在插入排序 快速排序和堆排序中,若關鍵字基本有序,應選擇哪種方法?若只從排序結婚的穩定性考

在插入排序 快速排序和堆排序中,若關鍵字基本有序,應選擇插入排序。極限情況,若關鍵字已經全部有序,則插入排序只要比較n 1次,而堆排序的比較次數明顯會更多。若只從排序結果的穩定性考慮,應選擇插入排序。因為在上述三種排序方法中,只有插入排序是穩定的排序。18 在直接插入和簡單選擇排序中,若初始資料基本...

二分法插入排序快速排序歸併排序堆排序的時間複雜度分別

二分法插入排序 複雜度 o nlogn 快速排序 o nlogn 有可能退化歸併排序 o nlogn 比較快 堆排序 o nlogn 最穩定的 排序演算法 所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。分類 在電腦科學所使用的排序演算法通常被分類為 計算的複...