模板:
//快速排序
#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 usingnamespace
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...