大家好,欢迎来到IT知识分享网。
C#编程常用的6种数据排序算法包括选择排序、冒泡排序、快速排序、插入排序、希尔排序、SORT排序算法。
程序界面
首先生成一组随机数据,然后选择相应排序算法,点击排序显示排序后的数据:
主程序代码:
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