快速排序 歸併排序

2022-06-30 18:00:22 字數 2056 閱讀 4354

模板:

//

快速排序

#include using

namespace

std;

const

int n = 100010

;int

a[n];

void qsort(int l, int

r) qsort(l,i - 1

);qsort(i,r);

}int

main()

qsort(

0,n-1

);

for (int i = 0; i)

}

do i++;while(a[i] do j--;while(a[j] >x);

這裡也可以寫成while(a[++i] < x);while(a[--j] > x);

每次選擇的數在快排之後都是左邊小於等於它,右邊大於等於它,所以遞迴迴圈的時候要根據所選的x來相應的變化:

1、若qsort(l,i -1);qsort(i,r), 那麼所選擇的中間變數就不能是x = a[l]或x = a[l + r >> 1],而應該是x = a[l + r + 1 >> 1]或x = a[r];

2、若qsort(l,j);qsort(j + 1,r);那麼所選擇的中間變數就不能是x = a[r]或 x = a[l + r + 1 >> 1], 而應該是x = a[l + r >> 1]或 x = a[l];

可以用比如3 5 1 4 2來模擬舉例,可以選擇第乙個數a[l]、中間的數a[l + r >> 1]、右邊的數a[r]來模擬,可以確定正確的策略都是在每次外層while迴圈結束後,qsort(l,j)都是小於等於x的數,qsort(j+1,r)都是大於等於x的數。

然後遞迴排序即可。

然後可以再選在只有兩個數的數列:1 2來進行模擬,確定上面qsort和中間比較數x的選擇策略。

第k個數:

//

快速排序

#include using

namespace

std;

const

int n = 100010

;int

a[n];

int qsort(int l, int r, int

k)

int t = j - l + 1

;

if(k <= t) return

qsort(l,j,k);

else

return qsort(j + 1, r, k-t);

}int

main()

歸併排序(求逆序對的個數):

#include using

namespace

std;

const

int n = 100000

;#define ll long long

inta[n],tmp[n];

ll qsort(

int l, int

r) }

while(i <= mid) tmp[k++] = a[i++];

while(j <= r) tmp[k++] = a[j++];

for(int i = l,j = 0;i <= r;i++,j++)

a[i] =tmp[j];

return

res;

}int

main()

最後答案res = qsort(l,mid) + qsort(mid + 1, r); 

res += mid - i + 1;

這裡雖然看起來是加了兩次,但實際上最後都會轉化成下面的部分。

因為最後數列被遞迴劃分都是成為個數為乙個的序列,然後當i == j的時候return 0遞迴棧返回,進行歸併的時候,就進入到while迴圈裡面進行判斷,無論一開始的左半部分和右半部分,最後歸併的時候都是從1、2、4、8來歸併起來的,所以雖然劃分了三部分:逆序對在左半部分、在右半部分、分散在左右半邊,但歸併的時候都是涵蓋在res += mid - i + 1裡面來了。

快速排序 歸併排序

感覺好久之前不寫這些基礎的東西忽然覺著,想複習一下,就簡單溫習一下排序的例子 package com.ruishenh.algoritmic public class sort static void printmsg int arrs system.out.println static int g...

快速排序,歸併排序

快速排序 quicksort 是對 氣泡排序的一種改進。設要排序的 陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。需要注意的是,多個相同的值的相對位置也許會在演算法結束時產...

歸併排序,快速排序

快速排序實現 filename fastsort description author hcq createtime 2019 04 12 10 01 public class fastsort arrays.stream arr foreach v system.out.println 排序後 s...