[C#]演算法-氣泡排序法(Bubble Sort)

這個排序演算法主要是利用二個迴圈,一個是要執行的回合數,另一個是真正比對數列資料,一次比較相臨的二個數,大的放右側,小的放左側,則可得最後一個數為最大數,則此數不再比較,以此類推,可以排出一個左小右大的數列。

演算過程的畫面如下程式畫面:

要排列的數列串是2,3,8,1,5,9,10,12,14

氣泡排序1.png

這是執行的過程及結果,一共執行了八回合

其中紅色字為需要交換字、藍色是正在比較的二個數、綠色是已排好的數,不會再進行比較

氣泡排序2.png




演算法的原始碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        public static void BubbleSort(int[] list)
        {
            int len = list.Length;
            for(int i = 1;i<=len-1;i++)//執行的回數
                for (int j = 1; j <= len - i; j++)//執行的次數
                {
                    if (list[j] < list[j - 1])
                    {
                        //二數交換
                        int temp = list[j];
                        list[j] = list[j - 1];
                        list[j - 1] = temp;
                    }
                }
        }
        static void Main(string[] args)
        {
            int[] list = { 2,3,1,6,2,9,4,1,7};
            Console.WriteLine("排序前數列");
            for (int i = 0; i < list.Length; i++)
                Console.Write(list[i]+" ");

            //氣泡排序
            BubbleSort(list);

            Console.WriteLine("\r\n排序後數列");
            for (int i = 0; i < list.Length; i++)
                Console.Write(list[i] + " ");

            Console.ReadLine();
        }
    }
}

執行結果如下:

氣泡排序3.png

執行動作過程的程式原始碼如下:

Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click_1(object sender, EventArgs e)
        {
            string value = this.textBox1.Text;

            
            if (value.Equals(""))
            {
                MessageBox.Show(this, "請先輸入數字串");
            }
            else
            {
                string[] strnum = value.Split(new Char[]{','});
                int[] num = new int[strnum.Length];
                for (int i = 0; i < num.Length; i++)
                {
                    num[i] = System.Convert.ToInt32(strnum[i]);
                }
                Form2 form2 = new Form2(num);
                form2.Visible = true;
            }
        }
	}
}

Form2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        private int[] num;
        
        private Font font = new Font("Verdana", 9);
        
        //Font font_word = new Font("Verdana", 12);
        private SolidBrush changebrush = new SolidBrush(Color.Red);
        private SolidBrush nochangebrush = new SolidBrush(Color.Blue);

        private SolidBrush brush_ok = new SolidBrush(Color.Green);
        private SolidBrush brush_word = new SolidBrush(Color.Black);
        private SolidBrush brush_word2 = new SolidBrush(Color.Pink);

        private int leftPoint = 20;
        private int topPoint = 20;

        public Form2()
        {
            InitializeComponent();
            num = new int[0];
        }
        public Form2(int[] num)
        {
            InitializeComponent();
            this.num = num;
        }
        
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            int len = num.Length;
            int pTop = 10;
            
            for (int i = 1; i <= len - 1; i++)//比較回數
            {
                g.DrawString("i=" + i, font, brush_word, 0, pTop + topPoint);

                int left = 20;               
                for (int j = 1; j <= len - i; j++)//比較次數
                {
                    if ((j-1) % 3 == 0)
                    {
                        pTop = pTop + topPoint;
                        left = 20;
                    }
                    left = left + 40;
                    g.DrawString("j=" + j, font, brush_word2, left, pTop);
                    
                    //if (num[j] < num[j - 1])
                    //{
                        //left = draw(num[j], num[j - 1], pTop, left + leftPoint, len - i, g);
                        //Console.WriteLine(left);
                        //pTop = rev[0];
                        //left = rev[1];
                    //}
                    //else
                    //{
                        left = draw(j, j - 1, pTop, left + leftPoint, len - i,(num[j] < num[j - 1]), g);
                        //Console.WriteLine(left);
                       // pTop = rev[0];
                        //left = rev[1];
                   // }
                    //二數交換
                    if(num[j]<num[j-1])
                    {
                        int temp = num[j];
                        num[j] = num[j - 1];
                        num[j - 1] = temp;
                     }

                }
            }

        }
        //索引位置1,索引位置2,開始的top,開始的left,已經排好的右側數列索引位置,是否要交換,畫筆
        private int draw(int swap1, int swap2, int startTop, int startLeft,int okIndex,Boolean haschange,Graphics g)
        {
            int left = startLeft;
            int top = startTop;
            SolidBrush brush ;
            for (int i = 0; i < num.Length; i++)
            {
                
                if (okIndex < i)
                {
                    brush = brush_ok;
                }
                else
                {
                    if (i == swap1 || i==swap2)
                    {
                        if (haschange)
                            brush = changebrush;//有要交換的顏色
                        else
                            brush = nochangebrush;//沒有要交換的顏色
                    }
                    else
                    {
                        brush = brush_word;
                    }
                }
                left = left + leftPoint;
                g.DrawString(num[i].ToString(), font, brush, left, top);
            }

            return left;
        }
       
    }
}

原始碼及執行程式下載

發表迴響