概述
荷兰国旗问题
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边
要求额外空间复杂度O(1),时间复杂度O(N)
思路
使用两个指针来标记小于num部分和大于num部分
less指向小于num部分最后一位
more指向大于num部分的第一位
cur指向当前位置
分三种情况:
(1)当arr[cur] > num时,交换arr[cur] 和 arr[–more],cur保持不变
(2)当arr[cur] < num时,交换arr[cur]和arr[++less],cur++
(3)当arr[cur] = num时,cur++
代码
#include <bits/stdc++.h>
using namespace std;
inline void swap(int arr[], int i, int j);
int* partition(int arr[], int L, int R, int num){
int less = L-1;
int more = R+1;
int cur = L;
while(cur < more){
if(arr[cur] > num){
swap(arr, --more, cur);
}else if (arr[cur] < num){
swap(arr, ++less, cur++);
}else{
cur++;
}
}
return new int [2] {less, more};
}
inline void swap(int arr[], int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
inline void outputArr(int arr[], int L, int R){
for(int i = L; i <= R; i++){
cout << arr[i] << " ";
}
cout << endl;
}
int main(){
int num;
int arr[10] = {2,4,8,9,4,3,2,1,6,8};
int *result;
cin >> num;
outputArr(partition(arr, 0, 9, num), 0, 1);
outputArr(arr, 0, 9);
}
相关问题
荷兰国旗问题是实现快速排序的基本思想,对于理解快速排序有重要意义
快速排序的实现可以参考这篇文章:
随机快速排序
最后
以上就是拉长小蘑菇为你收集整理的C/C++实现荷兰国旗问题荷兰国旗问题思路代码相关问题的全部内容,希望文章能够帮你解决C/C++实现荷兰国旗问题荷兰国旗问题思路代码相关问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复