首页 > 试题广场 >

数组的partition调整补充问题

[编程题]数组的partition调整补充问题
  • 热度指数:3606 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个数组arr,其中只可能含有0、1、2三个值,请实现arr的排序
[要求]
时间复杂度为,空间复杂度为


输入描述:
第一行一个整数N。表示数组长度
接下来一行N个整数表示数组内的数


输出描述:
输出N个整数,表示排序后的结果
示例1

输入

5
2 0 1 2 0

输出

0 0 1 2 2

备注:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<int>num(n);
    for(int i=0;i<n;i++)
        cin>>num[i];
    int left=-1,right=n,i=0;
    while(i<right)
    {
        if(num[i]==0)
            swap(num[i++],num[++left]);
        else if(num[i]==2)
            swap(num[i],num[--right]);
        else
            i++;
    }
    for(int i=0;i<n;i++)
        cout<<num[i]<<" ";
    return 0;
}

发表于 2019-08-30 20:59:17 回复(0)
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = scanner.nextInt();
        }
        
        int p0=0;
        int p2 = n-1;
        for(int i=0;i<=p2;i++){
            while(p0 < n && arr[p0]==0) p0++;
            while(p2>=0 && arr[p2]==2) p2--;
            if(arr[i]==0 && i>=p0){
                swap(arr,i,p0);
                i--;
            }else if(arr[i]==2 &&i<=p2){
                swap(arr,i,p2);
                i--;
            }
        }
        
        for(int i=0;i<n;i++){
            System.out.print(arr[i] +" ");
        }
	}
    
    public static void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}


发表于 2019-10-24 20:40:41 回复(0)
import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] arr = new int[N];
        for(int i = 0;i < N;i++){
            arr[i] = scanner.nextInt();
        }
        Arrays.sort(arr);
        for(int i = 0;i < N;i++){
            System.out.print(arr[i] + " ");
        }
    }
}
发表于 2021-08-12 14:26:49 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, x, b[3];
    memset(b, 0, sizeof(b));
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x;
        b[x]++;
    }
    for(int i=0;i<=2;i++)
        for(int j=1;j<=b[i];j++)
            cout<<i<<" ";
    return 0;
}

发表于 2020-02-28 10:33:25 回复(0)
荷兰国旗问题,用快排中的partition过程划分数组
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] strArr = br.readLine().split(" ");
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) arr[i] = Integer.parseInt(strArr[i]);
        int less = -1, more = n;     // 小于区域的尾,大于区域的头
        int index = 0, pivot = 1;
        while(index < more){
            if(arr[index] < pivot){
                less ++;
                swap(arr, less, index);       // 把当前数追加在小于区域的后面
                index ++;
            }else if(arr[index] > pivot){
                more --;
                swap(arr, more, index);       // 把当前数插入到大于区域的前面
            }else{
                index ++;
            }
        }
        for(int i = 0; i < n; i++) System.out.print(arr[i] + " ");
    }
    
    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

发表于 2021-11-17 15:25:34 回复(0)
import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] arr = new int[N];
        for(int i = 0;i < N;i++){
            arr[i] = scanner.nextInt();
        }
        Arrays.sort(arr);
        for(int i = 0;i < N;i++){
            System.out.print(arr[i] + " ");
        }
    }
}
发表于 2023-06-12 17:15:39 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
            Scanner s =new Scanner(System.in);
            String one = s.nextLine();
            int a =Integer.parseInt(one);
            String st=s.nextLine();
            String[] c =st.split(" ");
            int[] b=new int[c.length];
            for(int i=0;i<c.length;i++){
                b[i]=Integer.parseInt(c[i]);
            }
            Arrays.sort(b);
            for(int i=0;i<b.length;i++){
                System.out.print(b[i]+" ");
        }
    }
}
发表于 2022-11-17 18:04:31 回复(0)
//荷兰国旗问题
/*
1)若遍历到的位置为0,则说明它一定位于A的左侧。于是就和A处的元素交换,同时向右移动A和C。
2)若遍历到的位置为1,则说明它一定位于AB之间,满足规则,不需要动弹。只需向右移动C。
3)若遍历到的位置为2,则说明它一定位于B的右侧。于是就和B处的元素交换,交换后只把B向左移动,C仍然指向原位置。(因为交换后的C可能是属于A之前的,所以C仍然指向原位置


*/
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> vec;
    for (int i = 0; i < n; i++) {
        int tmp;
        cin >> tmp;
        vec.push_back(tmp);
    }
    //开始荷兰国旗
    int left_index = -1;
    int right_index = vec.size();
    int index = 0;
    while (index < right_index) { // 000 0 110 1 ==> 0000 0 011 1
        if (vec[index] == 0 ) {
            left_index ++;//先扩张一下右边界, 新扩张的边界 步满足 边界内部条件
            swap(vec[left_index],vec[index]);// 把满足边界条件的值进行交换
            index ++; // index 左边一定 不是 0 就是 1,所以 index ++ 即可
        } else if (vec[index] == 2) {
            right_index --;
            swap(vec[index],vec[right_index]);
            // 但是从右边换过来的 可能是 0 1 2 ,所以需要再次验证
        } else {
            index ++;
        }
    }
    for (auto x : vec) 
        cout << x <<  " ";
    return 0;
}

发表于 2022-07-18 16:32:43 回复(0)
import java.util.*;

public class Main{
    
    public static void main (String [] args){
        
        Scanner s = new Scanner (System.in);
        int len = s.nextInt();
        int index0 = 0, index1= 0,index2 = 0;
        
        for(int i=0;i<len;i++){
            int in = s.nextInt();
            if(0 == in){
              index0++;
            }
            if(1 == in){
               index1++;
            }
            if(2 == in){
               index2++;
            }
        }
        print(index0,0);
        print(index1,1);
        print(index2,2);
        
    }
    public static void print (int num ,int printNum){
        for(int i=0;i<num;i++){
            System.out.print(printNum+" ");
        }
    }
}
发表于 2021-11-08 11:48:14 回复(0)
n = input()
#对输入的列表排序
ls = sorted(list(input().split()))
print(' '.join(ls))

发表于 2021-06-30 09:45:52 回复(0)
def main():
    n=int(input())
    l=list(map(int,input().split()))
    
    n0,n1,n2=0,0,0
    for i in range(n):
        if l[i]==0:
            n0+=1
        elif l[i]==1:
            n1+=1
        else:
            n2+=1
    for i in range(n0):
        print(0,end=" ")
    for i in range(n1):
        print(1,end=" ")
    for i in range(n2):
        print(2,end=" ")
        
if __name__=="__main__":
    main()

发表于 2021-05-27 12:33:08 回复(0)
#include <bits/stdc++.h>
using namespace std;

void SortPartially(vector<int>& arr) {
    for (int i = 0, left = 0; i < arr.size(); ++i) {
        if (arr[i] == 0)
            swap(arr[left++], arr[i]);
    }

    for(int i = arr.size()-1, right = arr.size()-1; i >= 0; --i) {
        if (arr[i] == 2)
            swap(arr[right--], arr[i]);
    }
}

int main()
{
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }
    SortPartially(arr);
    for (auto c : arr) {
        cout << c << " ";
    }

    return 0;
}
发表于 2021-03-09 15:46:09 回复(0)
抖了个机灵
用sort就行???
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    for(int i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}


发表于 2020-09-04 20:23:47 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n; scanf("%d", &n);
    int num;
    int a=0, b=0, c=0;
    for(int i=0; i<n; i++){
        scanf("%d", &num);
        if(num == 0) a++;
        else if(num == 1) b++;
        else c++;
    }
    for(int i=0; i<(a+b+c); i++){
        if(i<a) printf("%d ", 0);
        else if(i>=a && i<a+b) printf("%d ", 1);
        else printf("%d ", 2);
    }
    return 0;
}

发表于 2020-02-15 20:41:42 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<int>v(n);
    for(int i=0;i<n;++i) cin>>v[i];
    // 三指针
    // i左侧为已排序好的0
    // k右侧为已排好序的2
    // j为工作指针
    int i = 0;
    int k = n-1;
    int j = 0;
    while(j<=k) 
    {
        if(v[j]==1)
            ++j;
        else if(v[j]==0)
            swap(v[i++],v[j++]);
        else swap(v[k--],v[j]);
    }
    for(auto item : v)
        cout<<item<<" ";
    return 0;
}
发表于 2020-02-11 12:32:50 回复(0)
#include<iostream>
#include<vector>

using namespace std;

int main()
{
    int N;
    cin>>N;
    vector<int> arr(N);    
    int x;
    int left = 0;
    int right = N - 1;
    int n = N;
    while(n--)
    {
        cin>>x;
        if (2 == x)
            arr[right--] = x;
        else if (0 == x)
            arr[left++] = x;
    }
    
    for(int j = left; j <= right; ++j)
        arr[j] = 1;
    
    for(int i = 0; i < N -1; ++i)
        cout<<arr.at(i)<<" ";
    cout<<arr[N - 1];
    
    return 0;    
}
发表于 2019-12-30 20:16:11 回复(0)
还有一种取巧的办法:统计0,1,2的数量,再分别输出,嘿嘿嘿!

#include<iostream>
using namespace std;

void sortLeft(int * const arr, int N, int k) //=const int arr[]
{
    if (N > 2)
    {
        int left = -1;
        int right = N;
        for (int i = 0; i < right; i++)
        {
            if (arr[i]<k)
                swap(arr[++left], arr[i]);
            else if (arr[i]>k)
            {
                swap(arr[--right], arr[i]);
                i--;
            }
                
        }
    }
}

int main()
{
    int N;
    cin >> N;
    int *arr = new int[N];
    for (int i = 0; i<N; i++)
    {
        cin >> arr[i];
    }

    sortLeft(arr, N, 1);

    for (int i = 0; i<N; i++)
    {
        cout << arr[i] << " ";
    }
    system("pause");
    delete []arr;
    return 0;

}
发表于 2019-10-17 23:35:02 回复(0)