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

排序算法是編程的基礎(chǔ)葛作。

常見(jiàn)的四種排序算法是:簡(jiǎn)單選擇排序、冒泡排序猖凛、插入排序和快速排序赂蠢。其中的快速排序的優(yōu)勢(shì)明顯,一般使用遞歸方式實(shí)現(xiàn)辨泳,但遇到數(shù)據(jù)量大的情況則無(wú)法適用虱岂。實(shí)際工程中一般使用“非遞歸”方式實(shí)現(xiàn)。本文搜集發(fā)布四種算法的源代碼及非遞歸快速排序的代碼菠红。

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

快速排序的思想是分治法 (Divide-and-ConquerMethod)量瓜。先從數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù)。分區(qū)過(guò)程途乃,將比這個(gè)數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊扔傅。再對(duì)左右區(qū)間重復(fù)第二步耍共,直到各區(qū)間只有一個(gè)數(shù)。

代碼改編自:C#實(shí)現(xiàn)常見(jiàn)排序算法_菜園赤子的博客-CSDN博客_c#排序算法


代碼:

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#猎塞,四種常見(jiàn)排序算法的可視化編程——北京聯(lián)高軟件開(kāi)發(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 button4_Click(object sender, EventArgs e)

???????{

???????????int[] dataArray = RandArray();

???????????slides.Clear();

???????????QuickSort(dataArray, 0, dataArray.Length - 1);

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

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

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

???????}


???????///

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

???????///改編自:https://blog.csdn.net/qq_36238093/article/details/97051032

???????///源代碼有明顯的 BUG

???????///

???????///

???????///

???????///

???????public void QuickSort(int[] dataArray, int left, int right)

???????{

???????????int i = left;

???????????int j = right;

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

???????????if (left >= right)

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

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

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

???????????while (i != j)

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

??????????????? while (i < j &&dataArray[j] >= temp)

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

??????????????????? j--;

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

??????????????? if (j > i)

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

??????????????????? dataArray[i] =dataArray[j];

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

??????????????? while (i < j &&dataArray[i] <= temp)

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

??????????????????? i++;

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

??????????????? if (i < j)

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

??????????????????? dataArray[j] =dataArray[i];

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


??????????????? slides.Add(Slide(button4.Text,dataArray, i, j));

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

???????????dataArray[i] = temp;

???????????//下面兩句源代碼有錯(cuò)誤试读!

???????????if (i > 0) QuickSort(dataArray, left, i - 1);

???????????if ((i + 1) < dataArray.Length) QuickSort(dataArray, i + 1, right);

???????}


???????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:solid 1px#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;

???????}


??? }

}



可下載排序算法源代碼練習(xí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荠耽,一起剝皮案震驚了整個(gè)濱河市钩骇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铝量,老刑警劉巖倘屹,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異慢叨,居然都是意外死亡纽匙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)拍谐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)烛缔,“玉大人,你說(shuō)我怎么就攤上這事轩拨〖桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵亡蓉,是天一觀的道長(zhǎng)晕翠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)砍濒,這世上最難降的妖魔是什么崖面? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任元咙,我火速辦了婚禮,結(jié)果婚禮上巫员,老公的妹妹穿的比我還像新娘庶香。我一直安慰自己,他們只是感情好简识,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布赶掖。 她就那樣靜靜地躺著,像睡著了一般七扰。 火紅的嫁衣襯著肌膚如雪奢赂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天颈走,我揣著相機(jī)與錄音膳灶,去河邊找鬼。 笑死立由,一個(gè)胖子當(dāng)著我的面吹牛轧钓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锐膜,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼毕箍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了道盏?” 一聲冷哼從身側(cè)響起而柑,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荷逞,沒(méi)想到半個(gè)月后媒咳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡种远,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年伟葫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片院促。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筏养,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出常拓,到底是詐尸還是另有隱情渐溶,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布弄抬,位于F島的核電站茎辐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拖陆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一弛槐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧依啰,春花似錦乎串、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至闷旧,卻和暖如春长豁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忙灼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工匠襟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人该园。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓酸舍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親爬范。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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