數組以n分爲大於小於n的左右兩部分

給定一個數組arr,和一個數num,請把小於等於num的數放在數 組的左邊,大於num的數放在數組的右邊。 要求額外空間複雜度O(1),時間複雜度O(N)
思路:兩個指針

void part_num(int arr[], int num, int len){
//方法1
	int pre = -1;
	int now = 0;
	while (now < len){
		if (arr[now] < num){
			if (++pre != now)
				swap(arr[pre], arr[now]);
		}
		++now;
	}
}
void part_num2(int arr[], int num, int len){
//方法1
	int left = 0;
	int right = len - 1;
	while (left < right){
	//邊界問題容易出錯
		while (arr[left] < num&&left<right)
			left++;
		while (arr[right]>=num&&right>left)
			right--;
		swap(arr[left++], arr[right--]);
	}
}

問題二(荷蘭國旗問題) 給定一個數組arr,和一個數num,請把小於num的數放在數組的 左邊,等於num的數放在數組的中間,大於num的數放在數組的 右邊。 要求額外空間複雜度O(1),時間複雜度O(N)

類似於上面兩種方法的綜合,一邊找大的,一邊找小的不

void part_num3(int arr[], int num, int len){
	int less = -1;
	int more = len;
	int now = 0;
	while (now<more){
		if (arr[now] < num)
			swap(arr[++less], arr[now++]);
		else if (arr[now]>num)
			swap(arr[--more], arr[now]);//注意now不能++這裏
		else
			++now;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章