C#编程常用的6种数据排序算法(附源代码)「建议收藏」

C#编程常用的6种数据排序算法(附源代码)「建议收藏」C#编程常用的6种数据排序算法包括选择排序、冒泡排序、快速排序、插入排序、希尔排序、SORT排序算法。

大家好,欢迎来到IT知识分享网。

C#编程常用的6种数据排序算法包括选择排序、冒泡排序、快速排序、插入排序、希尔排序、SORT排序算法。

程序界面

首先生成一组随机数据,然后选择相应排序算法,点击排序显示排序后的数据:

C#编程常用的6种数据排序算法(附源代码)「建议收藏」

程序运行界面

主程序代码:

private int[] array1;
private int[] array2;
public Form1()
{
  InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
        {
            //选择排序
            if (rab_Select.Checked)
                array2 = alinSelect(array1);
            //冒泡排序
            else if (rab_bubble.Checked)
                array2 = alinBubble(array1);
            //快速排序
            else if (rab_rapid.Checked)
            {
                int lowIndex = 0;
                int highIndex = array1.Length - 1;
                array2 = alinRapid(array1, lowIndex, highIndex);
            }
            //插入排序                
            else if (rab_insert.Checked)
                array2 = alinInsert(array1);
            //希尔排序
            else if (rab_xe.Checked)
            {
                int zl = array1.Length / 2;
                array2 = alinShell(array1,zl);
            }
            //sort方法排序                
            else if (rab_sort.Checked)
                array2 = alinSort(array1);
            textBox2.Clear();
            foreach (int a in array2)
            {
                textBox2.Text = textBox2.Text + a.ToString() + " ";
            }
        }

IT知识分享网

生成随机数据代码:

IT知识分享网private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            Random r = new Random();
            array1 = new int[r.Next(10, 20)];
            array2 = new int[array1.GetUpperBound(0) + 1];
            for (int i = 0; i < array1.GetUpperBound(0) + 1; i++)
            {
                array1[i] = r.Next(11, 100);
                textBox1.Text = textBox1.Text + array1[i] + " ";
            }
        }

1、选择排序算法

思想:如果有N个元素需要排序,那么首先找到最小的那个元素与第0位置上的元素交换,然后再从剩下的N-1个元素中找到最小的元素与第1位置上的元素交换,之后再从剩下的N-2个元素中找到最小的元素与第2位置上的元素交换,如此,直到所有元素都排序好。

源代码:

private int[] alinSelect(int[] array3)
        {
            for (int i = 0; i < array3.Length; i++)
            {
                int min = i;
                for (int j = i + 1; j < array3.Length; j++)
                {
                    if (array3[min] > array3[j])
                    {
                        min = j;
                    }
                }
                int temp = array3[i];
                array3[i] = array3[min];
                array3[min] = temp;
            }
            return array3;
        }

2、冒泡排序算法

思想:对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。

源代码:

IT知识分享网private int[] alinBubble(int[] array3)
        {
            for (int i = 0; i < array3.Length - 1; i++)
            {
                for (int j = 0; j < array3.Length - 1 - i; j++)
                {
                    if (array3[j] > array3[j + 1])
                    {
                        int temp = array3[j];
                        array3[j] = array3[j + 1];
                        array3[j + 1] = temp;
                    }
                }
            }
            return array3;
        }

3、插入排序算法

思想:插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

源代码:

private int[] alinInsert(int[] array3)
        {
            for (int i = 1; i < array3.Length; i++)
            {
                int inservalue = array3[i];
                int insertindex = i - 1;
                while (insertindex >= 0 && inservalue < array3[insertindex])
                {
                    array3[insertindex + 1] = array3[insertindex];
                    insertindex--;
                }
                array3[insertindex + 1] = inservalue;
            }
            return array3;
        }

4、快速排序算法

思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

源代码:

private int[] alinRapid(int[] array3, int low, int high)
        {
            if (low >= high)
                return array3;
            int index = SortUnit(array3, low, high);
            alinRapid(array3, low, index - 1);
            alinRapid(array3, index + 1, high);
            return array3;
        }
 private static int SortUnit(int[] array3, int low, int high)
        {
            int key = array3[low];
            while (low < high)
            {
                while (low < high && array3[high] > key)
                    high--;
                array3[low] = array3[high];
                while (low < high && array3[low] <= key)
                    low++;
                array3[high] = array3[low];
            }
            array3[low] = key;
            return high;
        }

5、希尔排序算法

思想:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,当增量减至1时,整个数据被分成一组,算法便终止,减少了交换的次数。

源代码:

private int[] alinShell(int[] array, int gap)
        {
            while(gap>0)
            {
                for (int i = 0; i < array.Length - gap; i++)
                {
                    if (array[i] > array[i + gap])
                    {
                        int temp = array[i];
                        array[i] = array[i + gap];
                        array[i + gap] = temp;
                        int j;
                        j = i;
                        do
                        {
                            if (j - gap < 0) break;
                            if (array[j] >= array[j - gap])
                            {
                                break;
                            }
                            else
                            {
                                int temp1 = array[j];
                                array[j] = array[j - gap];
                                array[j - gap] = temp1;
                            }
                            j = j - gap;
                        }
                        while (j > 0);
                    }
                }
                gap = gap / 2;                
            }
            return array;
        }

6、SORT排序算法

思想:使用C#内置数组类中的Sort()方法,可以直接对数组进行排序,非常简单,代码量非常少。

源代码:

private int[] alinSort(int[] array)
        {
            Array.Sort(array);
            Array.Reverse(array);            
            return array;
        }

程序整体代码(复制可用):

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private int[] array1;
        private int[] array2;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            Random r = new Random();
            array1 = new int[r.Next(10, 20)];
            array2 = new int[array1.GetUpperBound(0) + 1];
            for (int i = 0; i < array1.GetUpperBound(0) + 1; i++)
            {
                array1[i] = r.Next(11, 100);
                textBox1.Text = textBox1.Text + array1[i] + " ";
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //选择排序
            if (rab_Select.Checked)
                array2 = alinSelect(array1);
            //冒泡排序
            else if (rab_bubble.Checked)
                array2 = alinBubble(array1);
            //快速排序
            else if (rab_rapid.Checked)
            {
                int lowIndex = 0;
                int highIndex = array1.Length - 1;
                array2 = alinRapid(array1, lowIndex, highIndex);
            }
            //插入排序                
            else if (rab_insert.Checked)
                array2 = alinInsert(array1);
            //希尔排序
            else if (rab_xe.Checked)
            {
                int zl = array1.Length / 2;
                array2 = alinShell(array1,zl);
            }
            //sort方法排序                
            else if (rab_sort.Checked)
                array2 = alinSort(array1);
            textBox2.Clear();
            foreach (int a in array2)
            {
                textBox2.Text = textBox2.Text + a.ToString() + " ";
            }
        }
        //选择排序
        private int[] alinSelect(int[] array3)
        {
            for (int i = 0; i < array3.Length; i++)
            {
                int min = i;
                for (int j = i + 1; j < array3.Length; j++)
                {
                    if (array3[min] > array3[j])
                    {
                        min = j;
                    }
                }
                int temp = array3[i];
                array3[i] = array3[min];
                array3[min] = temp;
            }
            return array3;
        }
        //冒泡排序
        private int[] alinBubble(int[] array3)
        {
            for (int i = 0; i < array3.Length - 1; i++)
            {
                for (int j = 0; j < array3.Length - 1 - i; j++)
                {
                    if (array3[j] > array3[j + 1])
                    {
                        int temp = array3[j];
                        array3[j] = array3[j + 1];
                        array3[j + 1] = temp;
                    }
                }
            }
            return array3;
        }
        //插入排序
        private int[] alinInsert(int[] array3)
        {
            for (int i = 1; i < array3.Length; i++)
            {
                int inservalue = array3[i];
                int insertindex = i - 1;
                while (insertindex >= 0 && inservalue < array3[insertindex])
                {
                    array3[insertindex + 1] = array3[insertindex];
                    insertindex--;
                }
                array3[insertindex + 1] = inservalue;
            }
            return array3;
        }
        private int[] alinRapid(int[] array3, int low, int high)
        {
            if (low >= high)
                return array3;
            int index = SortUnit(array3, low, high);
            alinRapid(array3, low, index - 1);
            alinRapid(array3, index + 1, high);
            return array3;
        }
        private static int SortUnit(int[] array3, int low, int high)
        {
            int key = array3[low];
            while (low < high)
            {
                while (low < high && array3[high] > key)
                    high--;
                array3[low] = array3[high];
                while (low < high && array3[low] <= key)
                    low++;
                array3[high] = array3[low];
            }
            array3[low] = key;
            return high;
        }
        //希尔排序法
        private int[] alinShell(int[] array, int gap)
        {
            while(gap>0)
            {
                for (int i = 0; i < array.Length - gap; i++)
                {
                    if (array[i] > array[i + gap])
                    {
                        int temp = array[i];
                        array[i] = array[i + gap];
                        array[i + gap] = temp;
                        int j;
                        j = i;
                        do
                        {
                            if (j - gap < 0) break;
                            if (array[j] >= array[j - gap])
                            {
                                break;
                            }
                            else
                            {
                                int temp1 = array[j];
                                array[j] = array[j - gap];
                                array[j - gap] = temp1;
                            }
                            j = j - gap;
                        }
                        while (j > 0);
                    }
                }
                gap = gap / 2;                
            }
            return array;
        }
        private int[] alinSort(int[] array)
        {
            Array.Sort(array);
            Array.Reverse(array);            
            return array;
        }
    }
}

结语:

理解和掌握每一类算法的中心思想和关键代码,直接使用Array类中的Sort(array)方法是最简单的排序方法,掌握这个方法只需要很少量的代码就能实现数据的排序。

喜欢的请关注和收藏!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6747.html

(0)
上一篇 2022-12-20 21:10
下一篇 2022-12-20 21:30

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信