三色旗(荷蘭旗)排序演算法分析
三色旗問題又叫荷蘭旗問題,前提是有一個無序的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(≤105) 和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 題目描述 拿破侖席卷歐洲大陸之後,代表自由,平等,博愛的豎色三色旗也風靡一時。荷蘭國旗就是一面三色旗(只不過是橫向