ALDS1_6_B: Partition

题解
  1. 这里的分割是以数组中的最后一个元素为基准,最终的结果要让其左边的所有元素小于其,其右边的所有元素大于其。
  2. 这里设置了一个遍历变量j,其从第一个元素遍历到最后一个元素,被其遍历过的部分分成小于等于和大于a[n-1]的两部分,设置一个变量i来分隔这两部分,[0,i]部分小于等于a[n-1],(i,j)部分大于a[n-1]。
  3. 遍历中如果a[j]大于a[n-1],则什么都不用做,j继续向后,该元素会自动划入大于a[n-1]的部分;如果a[j]小于a[n-1],则i加一,然后将a[i]和a[j]互换,j继续向后遍历。
  4. 由于[0,i]部分是小于等于a[n-1],所以最后基准元素a[n-1]会成为该区域的最后一个元素,即该基准元素最后的下标为i。
题目
Partition
Quick sort is based on the Divide-and-conquer approach. In QuickSort(A, p, r), first, a procedure Partition(A, p, r) divides an array A[p..r] into two subarrays A[p..q-1] and A[q+1..r] such that each element of A[p..q-1] is less than or equal to A[q], which is, inturn, less than or equal to each element of A[q+1..r]. It also computes the index q.

In the conquer processes, the two subarrays A[p..q-1] and A[q+1..r] are sorted by recursive calls of QuickSort(A, p, q-1) and QuickSort(A, q+1, r).

Your task is to read a sequence A and perform the Partition based on the following pseudocode:

Partition(A, p, r)
1 x = A[r]
2 i = p-1
3 for j = p to r-1
4     do if A[j] <= x
5        then i = i+1
6            exchange A[i] and A[j] 
7 exchange A[i+1] and A[r]
8 return i+1

Note that, in this algorithm, Partition always selects an element A[r] as a pivot element around which to partition the array A[p..r].

Input
The first line of the input includes an integer n, the number of elements in the sequence A.

In the second line, Ai (i = 1,2,...,n), elements of the sequence are given separated by space characters.

Output
Print the sorted sequence. Two contiguous elements of the sequence should be separated by a space character. The element which is selected as the pivot of the partition should be indicated by [  ].

Constraints
1 ≤ n ≤ 100,000
0 ≤ Ai ≤ 100,000

Sample Input 1
12
13 19 9 5 12 8 7 4 21 2 6 11

Sample Output 1
9 5 8 7 4 2 6 [11] 21 13 19 12
代码块
#include <iostream>
using namespace std;

int Partition(int *a, int n)
{
    int i = -1;
    for(int j=0; j<n; j++)
    {
        if(a[j]<=a[n-1])
        {
            i++;
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }
    return i;
}

int main(void)
{
    int i, n;
    cin>>n;
    int a[n];
    for(i=0; i<n; i++)
        cin>>a[i];
    int temp = Partition(a, n);
    for(i=0; i<n; i++)
    {
        if(i!=n-1 && i!=temp)
            cout<<a[i]<<' ';
        else if(i!=n-1 && i==temp)
            cout<<'['<<a[i]<<']'<<' ';
        else if(i==n-1 && i==temp)
            cout<<'['<<a[i]<<']'<<endl;
        else
            cout<<a[i]<<endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值