当前位置:网站首页>Rainbow sorting | Dutch flag problem

Rainbow sorting | Dutch flag problem

2020-11-09 08:47:43 Yard farmland

WeChat search 「 Yard farmland, Xiao Qi 」, Focus on this program in New York , reply 「01-05」 You can get a selection of computer books 、 Personal writing notes 、 Big factory surface 、 Interview materials and other resources , mua ~

The Dutch flag problem is also called tricolor order , Or rainbow sort ,

Because the Dutch flag has three colors , The problem with this question is to give you three colors , Arrange in the given order .

Yes, of course , There are various ways to ask questions , Some give numbers , Some give letters , But the essence is the same .

For example, give you an array of three numbers :312312312231111122113,
The requirements are as follows 1 2 3 Put it in order , namely : 111111111222222222223333333333
( Please don't really count , You lose when you get serious )

Or use our classic 「 Baffle method 」.

In the express line , We used two baffles to divide the array into three areas :

<= pivot; Unordered range ;> pivot

So here's three baffles , Divided into four areas :

1, 2, 3, Unordered range

Partition

say concretely , use i, j, k These three hands are divided :
[0, i): save 1
[i, j): save 2

(k, array.length-1]: save 3

here j Put it to the left and right of unsorted intervals , But basically we put it on the left , So we don't have to “ new in order to be different ”.

initialization :

i = 0;
j = 0;
k = array.length - 1;
In this way, we can guarantee 1,2,3 Each interval of is empty .

We go through Watch the pointer j Pointing elements To keep narrowing the unsorted range , Until it's empty .

Example :1232312

To look good , The ordered elements we use RGB Three primary colors to mark .

Step1.

The pointer j Point to 1, and 1 Should be placed in [0, i) Within the interval , The pointer should be put here i And a pointer j Exchange the elements , And the two hands go forward .

Although at this point it doesn't make any difference whether it's a swap or not , But if i and j There are elements in between , There's a difference , such as Step7.

Step2.

The pointer j Point to 2, and 2 Should be placed in [i, j) Within the interval , therefore j++.

Step3.

The pointer j Point to 3, and 3 Should be placed in
(k, array.length-1] Within the interval , So here
j and k Point to the element exchange , also k--.

Notice that you can't j-- 了 , Because I haven't seen the new elements yet , I don't know what it is .

Step4.

The pointer j Point to 2, Same as Step2, Move the pointer directly j that will do .

Step5.

Keep moving the pointer j.

Step6.

Same as Step3.

Step7.

This step is obvious ,
because 1 Should be placed in [0,i) Section , So here's the pointer i,j Exchange the elements you point to , also i++, j++.

So the unsorted interval is empty , We're in line ~

Time complexity

This algorithm bottle neck That's it while loop In the , Every cycle is O(1), The total is O(n).

Spatial complexity

O(1)

If you like this article , Remember to leave me a like message ~ Your support and recognition , It's the biggest driving force of my creation , See you in the next article !

This is Qi , New York program , Lifelong learners , Every night 9 spot , Let's meet you in the cloud study room !

See my... For more dry articles Github: https://github.com/xiaoqi6666/NYCSDE

版权声明
本文为[Yard farmland]所创,转载请带上原文链接,感谢