1. 程式人生 > >三色旗(荷蘭旗)排序演算法分析

三色旗(荷蘭旗)排序演算法分析

三色旗問題又叫荷蘭旗問題,前提是有一個無序的char陣列,裡面的元素只能是{‘R’,'G','B'}中的一個,比如{'B','R','G','R','B','B','G','B','R'},現在要求不允許藉助額外的空間,即只能通過自身元素交換的方法將陣列重排序,最終達到RGB順序排序,比如例子中的陣列排序後變為:RRRGGBBBB。

演算法分析:

分別定義三個指標,rindex, gindex, bindex, rindex和gindex初始時指向第一個元素,gindex指向最後一個。

rindex始終指向左邊第一個非R的元素,它的作用就是當gindex為R時和gindex的元素進行交換。

gindex用來遍歷陣列,當gindex<=bindex時遍歷結束。

bindex從右邊遞減始終指向從右邊數第一個非B的元素。

當gindex指向的元素是R時,和rindex的元素進行交換,gindex++, rindex++;

當gindex指向的元素是G時,什麼都不做,gindex++;

當gindex指向的元素是B時,和bindex指向的元素互換,bindex--;(這一步為什麼gindex++,原因請思考這樣的陣列GBRB)

當遍歷完陣列之後所有的R都在左邊,G在中間,B在右邊

java實現程式碼如下:

package com.jackie.algorithm;

public class SortThreeColors {
	//Swap the specified indexs of a char array
	private static void swap(char[] colors,int a, int b){
		char tmp ;
		tmp = colors[a];
		colors[a] = colors[b];
		colors[b] = tmp;
	}
	
	//Sort the char arrays by "RGB" order
	public static char[] sortThreeColors(char[] colors){
		int rindex = 0;
		int gindex = 0;
		int bindex = colors.length-1;
		
		while(gindex < bindex){
			if(colors[gindex] == 'R'){
				if(rindex != gindex ){
					swap(colors, rindex, gindex);
				}
				rindex++;
				gindex++;
			}else if (colors[gindex] == 'B'){
				if(bindex != gindex){
					swap(colors, gindex, bindex);
				}
				bindex--;
			}else{
				gindex++;
			}
		}
		return colors;
	}

	public static void main(String[] args) {
		char colors[] = new char[]{'B','R','G','R','B','B','G','B','R'};
		colors = sortThreeColors(colors);
		System.out.println(colors);
	}

}


相關推薦

三色旗荷蘭排序演算法分析

三色旗問題又叫荷蘭旗問題,前提是有一個無序的char陣列,裡面的元素只能是{‘R’,'G','B'}中的一個,比如{'B','R','G','R','B','B','G','B','R'},現在要求不允許藉助額外的空間,即只能通過自身元素交換的方法將陣列重排序,最終達到RG

臭皮匠排序Stooge Sort----(排序演算法十二)

1.演算法原理 2.程式碼實現 #include <stdio.h> //printArray打印出陣列 void printArray(int a[],int size){

Java排序演算法分析與實現:快排、氣泡排序、選擇排序、插入排序、歸併排序

轉載  https://www.cnblogs.com/bjh1117/p/8335628.html   一、概述:   本文給出常見的幾種排序演算法的原理以及java實現,包括常見的簡單排序和高階排序演算法,以及其他常用的演算法知識。   簡單排序:氣泡排序、選擇排序、

排名演算法--淘寶搜尋排序演算法分析

原文:https://blog.csdn.net/u011966339/article/details/78052569  淘寶搜尋排序的目的是幫助使用者快速的找到需要的商品。從技術上來說,就是在使用者輸入關鍵詞匹配到的商品中,把最符合使用者需求的商品排到第一位,其它的依次排在後續相應

常見的三種排序演算法分析及對比實現冒泡、選擇、插入

1. 氣泡排序      1)基本思想:           在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,           讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就

演算法分析總結排序演算法效能及比較總結

一、按平均時間將排序分為四類: (1)平方階(O(n2))排序      一般稱為簡單排序,例如直接插入、直接選擇和氣泡排序; (2)線性對數階(O(nlgn))排序      如快速、堆和歸併排序; (3)O(n1+£)階排序      £是介於0和1之間的常數,即0

各種基本演算法實現小結—— 排序演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

LeetCode 75 顏色分類荷蘭問題

給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。 此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。 注意: 不能使用程式碼庫中的排序函式來解決這道題。 示例:

PTA 資料結構與演算法題目集中文7-37 模擬EXCEL排序25 分排序

Excel可以對一組紀錄按任意指定列排序。現請編寫程式實現類似功能。 輸入格式: 輸入的第一行包含兩個正整數N(≤10​5​​) 和C,其中N是紀錄的條數,C是指定排序的列號。之後有 N行,每行包含一條學生紀錄。每條學生紀錄由學號(6位數字,保證沒有重複的學號)、姓名(不

演算法排序演算法排序、氣泡排序、快速排序

第一次排序:首先,找一個"基準數",比如5,然後,先從右到左,找到第一個小於基準數的數,4,再從左到右,找到第一個大於基準數的數,9將它們進行交換,5,1,4,26,2,9,5,7,52,21繼續從右到左,尋找小於基準數的數,從左到右,尋找大於基準數的數,並交換,直到兩個相遇,5,1,4,2,26,9,5,7

資料結構與演算法2排序演算法,用Python實現插入,選擇,堆排,冒泡,快排和歸併排序

前段時間鼓起勇氣和老闆說了一下以後想從事機器學習方向的工作,所以最好能有一份不錯的實習,希望如果我有好的機會他可以讓我去,沒想到老闆非常通情達理,說人還是要追尋自己感興趣的東西,忙完這陣你就去吧。所以最

C語言實現摘自資料結構與演算法分析 C語言描述

一、概述: 棧(stack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。對棧的基本操作有Push(進棧)和Pop(出棧),前者相當於插入,後者則是刪除最後插入的元素。 棧有時又叫做LIFO(後進先出)表。在圖1中描述的模型只象徵著Pus

Pixhawk之姿態解算篇2_mahony演算法分析

一、開篇   還是沒能進入到原始碼部分研究,對姿態解算過程太過於模糊,所以主要開始研究一下關於姿態解算的過程和實現,本篇博文主要是以mahony的演算法為基礎理解姿態解算的過程,主要參考的論文就是William Premerlani and Paul Bizard的關於DC

算法系列排序演算法中篇--歸併排序和快速排序

在算法系列(三)排序演算法上篇 一文中,介紹了氣泡排序,插入排序和選擇排序演算法。這篇文章繼續講解排序演算法。 概述 氣泡排序,插入排序和選擇排序演算法這些演算法的時間複雜度都是O(N^2),是否有更

【原始碼】嚴蔚敏資料結構演算法C++十八排序——歸併排序

日常說明:有錯誤歡迎大家指正。另外本部落格所有的程式碼博主編寫後均除錯通過。重要提醒!!!!博主使用的是VS2017,如果有低版本的小夥伴最好新建空專案將此程式碼複製上去。 更多演算法請關注我的演算法

排序演算法之希爾優化冒泡排序

希爾排序是用來優化其他演算法的,進行分組,初始的gap等於n/2,然後依次減半,直到最後取1.這個1有點特別,如果直接放裡面會導致死迴圈。在分組的for迴圈裡面有點不方便,所以在後面進行for迴圈程式碼修正,單獨寫變數的增值。用if來解決這個死迴圈的問題。分組後進行冒泡,進

Java技術棧2排序演算法冒泡,快速排序

1.氣泡排序 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端

排序——合並歸並排序

有序 pre sort left blog 只有一個 當前 code 兩個 原理圖: 實現代碼: #define MAX 1000 //合並區間a[left,middel]和a[middle+1,right] void Merge(int a[],int left,i

Hadoop十四MapReduce原理分析

資源 並行處理 ons 描述 並發數 span col 數據分析 sub 前言   上一篇我們分析了一個MapReduce在執行中的一些細節問題,這一篇分享的是MapReduce並行處理的基本過程和原理。   Mapreduce是一個分布式運算程序的編程框架,是用戶開發

編程之法:面試和算法心得荷蘭國旗

數組排列 alt partition void 不同 begin 心得 不能 sta 內容全部來自編程之法:面試和算法心得一書,實現是自己寫的使用的是java 題目描述 拿破侖席卷歐洲大陸之後,代表自由,平等,博愛的豎色三色旗也風靡一時。荷蘭國旗就是一面三色旗(只不過是橫向