排序

1.选择排序法对一维数组进行排序
if (G_int_value != null)
{
int min;//定义一个int变量,用来存储数组下标
for (int i = 0; i < G_int_value.Length - 1; i++)//循环访问数组中的元素值(除最后一个)
{
min = i;//为定义的数组下标赋值
for (int j = i + 1; j < G_int_value.Length; j++)//循环访问数组中的元素值(除第一个)
{
if (G_int_value[j] < G_int_value[min])//判断相邻两个元素值的大小
min = j;
}
int t = G_int_value[min];//定义一个int变量,用来存储比较大的数组元素值
G_int_value[min] = G_int_value[i];//将小的数组元素值移动到前一位
G_int_value[i] = t;//将int变量中存储的较大的数组元素值向后移
}
txt_str2.Clear();//清空控件内字符串
foreach (int i in G_int_value)//遍历字符串集合
{
txt_str2.Text += i.ToString() + ", ";//向控件内添加字符串
}
}
else
{
MessageBox.Show("首先应当生成数组,然后再进行排序。", "提示!");
}
2.冒泡排序法对一维数组进行排序
if (G_int_value != null)
{
//定义两个int类型的变量,分别用来表示数组下标和存储新的数组元素
int j, temp;
for (int i = 0; i < G_int_value.Length - 1; i++)//根据数组下标的值遍历数组元素
{
j = i + 1;
id://定义一个标识,以便从这里开始执行语句
if (G_int_value[i] > G_int_value[j])//判断前后两个数的大小
{
temp = G_int_value[i];//将比较后大的元素赋值给定义的int变量
G_int_value[i] = G_int_value[j];//将后一个元素的值赋值给前一个元素
G_int_value[j] = temp;//将int变量中存储的元素值赋值给后一个元素
goto id;//返回标识,继续判断后面的元素
}
else
if (j < G_int_value.Length - 1)//判断是否执行到最后一个元素
{
j++;//如果没有,则再往后判断
goto id;//返回标识,继续判断后面的元素
}
}
txt_str2.Clear();//清空控件内字符串
foreach (int i in G_int_value)//遍历字符串集合
{
txt_str2.Text += i.ToString() + ", ";//向控件内添加字符串
}
}
else
{
MessageBox.Show("首先应当生成数组,然后再进行排序。", "提示!");
}
3.快速排序法对一维数组进行排序
private int[] G_int_value;//定义数组字段

private Random G_Random = new Random();//创建随机数对象

//交换数据
private void swap(ref int l, ref int r)
{
int temp;//临时值
temp = l;//记录前一个值
l = r;//记录后一个值
r = temp;//前后交换数据
}

private void Sort(int[] list, int low, int high)
{
int pivot;//临时变量,用来存储最大值
int l, r;//分别用来记录遍历到的索引和最大索引
int mid;//中间索引
if (high <= low)//判断输入的值是否合法
return;
else if (high == low + 1)//判断两个索引是否相邻
{
if (list[low] > list[high])//判断前面的值是否大于后面的值
swap(ref list[low], ref list[high]);//交换前后索引的值
return;
}
mid = (low + high) >> 1;//记录数组的中间索引
pivot = list[mid];//初始化临时变量的值
swap(ref list[low], ref list[mid]);//交换第一个值和中间值的索引顺序
l = low + 1;//记录遍历到的索引值
r = high;//记录最大索引
try
{
//使用do...while循环遍历数组,并比较前后值的大小
do
{

while (l <= r && list[l] < pivot)//判断遍历到的索引是否小于最大索引
l++;//索引值加1
while (list[r] >= pivot)//判断最大值是否大于等于记录的分支点
r--;//做大索引值减1
if (l < r)//如果当前遍历到的值小于最大值
swap(ref list[l], ref list[r]);//交换顺序

} while (l < r);
list[low] = list[r];//在最小索引处记录最小值
list[r] = pivot;//在最大索引处记录最大值
if (low + 1 < r)//判断最小索引是否小于最大索引
Sort(list, low, r - 1);//调用自身进行快速排序
if (r + 1 < high)//判断最大索引是否小于数组长度
Sort(list, r + 1, high);//调用自身进行快速排序
}
catch { }
}
4.直接插入法对一维数组进行排序
if (G_int_value != null)
{
for (int i = 0; i < G_int_value.Length; ++i)//循环访问数组中的元素
{
int temp = G_int_value[i];//定义一个int变量,并使用获得的数组元素值赋值
int j = i;
while ((j > 0) && (G_int_value[j - 1] > temp))//判断数组中的元素是否大于获得的值
{
G_int_value[j] = G_int_value[j - 1];//如果是,则将后一个元素的值提前
--j;
}
G_int_value[j] = temp;//最后将int变量存储的值赋值给最后一个元素
}
txt_str2.Clear();//清空控件内字符串
foreach (int i in G_int_value)//遍历字符串集合
{
txt_str2.Text += i.ToString() + ", ";//向控件内添加字符串
}
}
else
{
MessageBox.Show("首先应当生成数组,然后再进行排序。", "提示!");
}
5.希尔排序法对一维数组进行排序
if (G_int_value != null)
{
int inc;//定义一个int变量,用来确定每个有序序列的个数
for (inc = 1; inc <= G_int_value.Length / 9; inc = 3 * inc + 1) ;//为有序序列赋值
for (; inc > 0; inc /= 3)
{
for (int i = inc + 1; i <= G_int_value.Length; i += inc)
{
int t = G_int_value[i - 1];//记录当前值
int j = i;//定义下一个索引
while ((j > inc) && (G_int_value[j - inc - 1] > t))
{
G_int_value[j - 1] = G_int_value[j - inc - 1];//交换数据
j -= inc;
}
G_int_value[j - 1] = t;//将下一个元素值设置为当前值
}
}
txt_str2.Clear();//清空控件内字符串
foreach (int i in G_int_value)//遍历字符串集合
{
txt_str2.Text += i.ToString() + ", ";//向控件内添加字符串
}
}
else
{
MessageBox.Show("首先应当生成数组,然后再进行排序。", "提示!");
}

原文地址:https://www.cnblogs.com/jxyZ/p/3197065.html