int OnePartition(int* ar, int left, int right)
{
int midVal = ar[left]; // 基准
while (left < right)
{
while (left < right)
{
if (ar[right] >= midVal) right--;
else {
swap(ar[right], ar[left++]); break;
}
}
while (left < right)
{
if (ar[left] <= midVal) left++;
else {
swap(ar[left], ar[right--]); break;
}
}
}
return left;
}
int Select_K(int* ar, int left,int right,int pos)
{
int i = OnePartition(ar, left, right);
if (i < pos-1) i = Select_K(ar, i+1, right, pos); // 右边
else if (i > pos-1) i = Select_K(ar, left, i - 1, pos); //左边
else return ar[i];
}
int main()
{
int arr[] = { 67,12,89,23,90,100 ,34,78,56,45 };
int n = sizeof(arr) / sizeof(arr[0]);
//cout << Cpair_ar(arr, n);
for(int i = 1; i < 11; i++)
cout <<i<<": "<< Select_K(arr, 0, n - 1, i) <<endl;
return 0;
}
快排
// 一次划分
// 把小的插入头部位置,可用于链表
int Partition(vector<int>& nums, int l, int r) {
int pivot = nums[r];
int i = l - 1;
for (int j = l; j <= r - 1; ++j) {
if (nums[j] <= pivot) { // 找到比基准小的
i = i + 1; // 这里加一的意思是。当前i位置表示最小值的边界下标。
// 我们需要在下一位置插入新的小值。
swap(nums[i], nums[j]); // 将其插入到头部
}
}
swap(nums[i + 1], nums[r]);// 将基准插入
return i + 1;
}
// 双指针单方向推进
int Partition1(vector<int>& ar, int left, int right)
{
int i = left, j = left + 1;
int pivot = ar[i];
while (i <= right && j <= right)
{ // 注意这里的几个while条件都是带等号的
while (j <= right && ar[j] <= pivot) j++; // j遍历小值,跳出后所在位置为大值
if (j > right) break;
if (i < j) i = j + 1; // 找j后面的小值
while (i <= right && ar[i] > pivot) i++; // 找j后小值
if (i > right) break;
std::swap(ar[i], ar[j]);
//j++;
}
std::swap(ar[j - 1], ar[left]);
return j-1;
}
int Partition2(int* ar, int left, int right)
{
int i = left, j = right;
int tmp = ar[i];
while (i < j)
{
while (i < j && ar[j] > tmp) j--;
if (i >= j) break;
while (i < j && ar[i] <= tmp) i++; // 这里 <= 是因为,i的初值是left。而基准取的也是left
if (i >= j) break;
std::swap(ar[i], ar[j]);
}
std::swap(ar[i], ar[left]);
return i;
}
void QuickPass(int* ar, int left, int right)
{
if (left < right)
{
int pos = Partition(ar, left, right);
QuickPass(ar, 0, pos - 1);
QuickPass(ar, pos + 1, right);
}
}
void QuickSort(int* ar, int n)
{
if (nullptr == ar || n < 1) return;
QuickPass(ar, 0, n-1);
}
int main()
{
int arr[] = { 4,5,2,3,4,4,3,1,7,8,4,9,10,6 };
QuickSort(arr, sizeof(arr) / sizeof(arr[0]));
for (int a : arr)
std::cout << a << ' ';
std::cout << std::endl;
return 0;
}