C#抗俄,快速排序算法(Quick Sort)的非遞歸實(shí)現(xiàn)與數(shù)據(jù)可視化

排序算法是編程的基礎(chǔ)脆丁。


?常見的四種排序算法是:簡單選擇排序、冒泡排序动雹、插入排序和快速排序槽卫。其中的快速排序的優(yōu)勢明顯,一般使用遞歸方式實(shí)現(xiàn)胰蝠,但遇到數(shù)據(jù)量大的情況則無法適用歼培。實(shí)際工程中一般使用“非遞歸”方式實(shí)現(xiàn)。


快速排序(Quick Sort)算法(非遞歸方式)

實(shí)際工程中一般使用“非遞歸”方式實(shí)現(xiàn)茸塞。


做良心程序員躲庄,工程文件與源代碼:

代碼:

using System;

using System.Text;

using System.Collections.Generic;

using System.Windows.Forms;


namespace WindowsFormsApp6

{

???public partial class Form1 : Form

??? {

???????Random rnd = new Random((int)DateTime.Now.Ticks);

???????List slides = new List();


???????public Form1()

???????{

???????????InitializeComponent();

???????}


???????private void Form1_Load(object sender, EventArgs e)

???????{

???????????this.Text = "C#,四種常見排序算法的可視化編程——北京聯(lián)高軟件開發(fā)有限公司";

???????????button1.Text = "選擇排序"; button1.Cursor = Cursors.Hand;

???????????button2.Text = "冒泡排序"; button2.Cursor = Cursors.Hand;

???????????button3.Text = "插入排序"; button3.Cursor = Cursors.Hand;

???????????button4.Text = "快速(遞歸)"; button4.Cursor = Cursors.Hand;

???????????button5.Text = "快速(非遞歸)"; button5.Cursor = Cursors.Hand;

???????????panel1.Dock = DockStyle.Top;

???????????panel2.Dock = DockStyle.Fill;

???????????webBrowser1.Navigate("http://www.315soft.com");

???????}


???????private int[] RandArray()

???????{

???????????int n = 20;

???????????int[] dataArray = new int[n];

???????????for (int i = 0; i < n; i++)

???????????{

??????????????? dataArray[i] = rnd.Next(20,100);

???????????}

???????????return dataArray;

???????}


???????private void button5_Click(object sender, EventArgs e)

???????{

??????????? QuickSort(RandArray());

???????????loop = 0;

???????????timer1.Interval = 100;

???????????timer1.Enabled = true;

???????}


???????///

???????///快速排序(非遞歸)

???????///改編自:https://blog.csdn.net/syaguang2006/article/details/24441025

???????///

???????///

???????///

???????///

???????///

???????private void QuickSort(ref int[] dataArray, int Low, int High,Stack stack)

???????{

???????????int low = Low;

???????????int high = High;

???????????int temp = dataArray[low];

???????????while (high > low)

???????????{

???????????????while (low < high&& temp <= dataArray[high])

??????????????? {

??????????????????? high--;

??????????????? }

??????????????? if (high > low)

??????????????? {

??????????????????? dataArray[low] =dataArray[high];

??????????????????? dataArray[high] = temp;

??????????????? }

??????????????? while (low < high &&temp >= dataArray[low])

??????????????? {

??????????????????? low++;

??????????????? }

??????????????? if (high > low)

??????????????? {

??????????????????? dataArray[high] =dataArray[low];

??????????????????? dataArray[low] = temp;

??????????????? }

??????????????? if (low == high)

??????????????? {

??????????????????? if (Low < low - 1)

??????????????????? {

??????????????????????? stack.Push(Low);

??????????????????????? stack.Push(low - 1);

??????????????????? }

??????????????????? if (High > low + 1)

??????????????????? {

??????????????????????? stack.Push(low + 1);

??????????????????????? stack.Push(High);

??????????????????? }

??????????????? }

???????????}

???????}


???????private void QuickSort(ref int[] dataArray)

???????{

???????????Stack s = new Stack();

???????????s.Push(0);

???????????s.Push(dataArray.Length - 1);

???????????while (s.Count > 0)

???????????{

??????????????? int low = s.Pop();

??????????????? int high = s.Pop();

??????????????? if (low > high)

??????????????? {

??????????????????? int temp = low;

??????????????????? low = high;

??????????????????? high = temp;

??????????????? }

??????????????? QuickSort(ref dataArray, low,high, s);

??????????????? slides.Add(Slide(button5.Text,dataArray, low, high));

???????????}

???????}


???????private string Slide(string title, int[] dataArray, int a, int b)

???????{

???????????StringBuilder sb = new StringBuilder();

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

??? ????????sb.AppendLine("");

???????????sb.AppendLine("td {vertical-align:bottom;text-align:center;font-size:12px; } ");

???????????sb.AppendLine(".bar { width:" + (int)((webBrowser1.Width -dataArray.Length * 11) / dataArray.Length) + "px;font-size:12px;border:solid1px #FF6701;background-color:#F08080;text-align:center;border-radius:3px;}");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????sb.AppendLine("方法:" + title +

"</td>");

???????????sb.AppendLine("數(shù)據(jù):" +

dataArray.Length + "</td>");

???????????sb.AppendLine("步驟:[0]</td>");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????sb.AppendLine("
");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????for (int i = 0; i < dataArray.Length; i++)

???????????{

??????????????? if (i == a || i == b)

??????????????? {

???????????????????sb.AppendLine("" + dataArray[i] + "");

??????????????? }

??????????????? else

??????????????? {

???????????????????sb.AppendLine("" + dataArray[i] + "");

??????????????? }

???????????}


???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????sb.AppendLine("");

???????????return sb.ToString();

???????}



???????int loop = 0;


???????private void timer1_Tick(object sender, EventArgs e)

???????{

???????????if (loop < slides.Count + (3000 / timer1.Interval))

???????????{

??????????????? if (loop < slides.Count)

??????????????? {

??????????????????? webBrowser1.DocumentText =slides[loop].Replace("[0]", loop + " / " + slides.Count);

??????????????????? loop++;

??????????????????? return;

??????????????? }

??????????????? loop++;

??????????????? return;

???????????}

???????????loop = 0;

???????}


??? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钾虐,一起剝皮案震驚了整個濱河市噪窘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禾唁,老刑警劉巖效览,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異荡短,居然都是意外死亡丐枉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門掘托,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘦锹,“玉大人,你說我怎么就攤上這事闪盔⊥湓海” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵泪掀,是天一觀的道長听绳。 經(jīng)常有香客問我,道長异赫,這世上最難降的妖魔是什么椅挣? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任头岔,我火速辦了婚禮,結(jié)果婚禮上鼠证,老公的妹妹穿的比我還像新娘峡竣。我一直安慰自己,他們只是感情好量九,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布适掰。 她就那樣靜靜地躺著,像睡著了一般荠列。 火紅的嫁衣襯著肌膚如雪类浪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天肌似,我揣著相機(jī)與錄音戚宦,去河邊找鬼。 笑死锈嫩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垦搬。 我是一名探鬼主播呼寸,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猴贰!你這毒婦竟也來了对雪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤米绕,失蹤者是張志新(化名)和其女友劉穎瑟捣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栅干,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迈套,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碱鳞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桑李。...
    茶點(diǎn)故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窿给,靈堂內(nèi)的尸體忽然破棺而出贵白,到底是詐尸還是另有隱情,我是刑警寧澤崩泡,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布禁荒,位于F島的核電站,受9級特大地震影響角撞,放射性物質(zhì)發(fā)生泄漏呛伴。R本人自食惡果不足惜勃痴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磷蜀。 院中可真熱鬧召耘,春花似錦、人聲如沸褐隆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庶弃。三九已至衫贬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歇攻,已是汗流浹背固惯。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缴守,地道東北人葬毫。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像屡穗,于是被迫代替她去往敵國和親贴捡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容