目录
1、冒泡排序
排序数组元素的过程总是小数往前放,大数往后放,类似水中气泡往上升的动作,所以称作冒泡排序。
冒泡算法由双层循环实现,其中外层循环用于控制排序轮数,一般是要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内层循环主要用于对比数组中每个临近元素的大小,以确定是否交换位置,对比和交换次数以排序轮数而减少。
//冒泡排序,结果是由小到大的排列
//下一次循环是对数组中其他的元素进行类似操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test7_9
{
class Program
{
static void Main(string[] args)
{
if (args is null) //解除IDE0060
{
throw new ArgumentNullException(nameof(args));
}
int[] arr = new int[] { 63, 4, 24, 1, 3, 15 }; //定义一维源数组,并赋值
int j, temp; //定义数组下标j和局部缓存变量
for (int i = 0; i < arr.Length - 1; i++) //外循环,i是循环次数
{
j = i + 1;
id: //定义标识,用于循环地执行内循环
if (arr[i] > arr[j]) //如果arr[i] > arr[j],则交换(小数放在数组前面)
{
temp = arr[i]; //每层外循环确定本层的最小数并放在数组最左边
arr[i] = arr[j];
arr[j] = temp;
goto id; //返回标识,if后因为交换过了不满足>条件,所以执行else
}
else
if (j < arr.Length - 1) //否则,只要不是执行到最后一个元素
{
j++; //就j++
goto id; //返回标识,继续判断arr[i] > arr[j]
}
}
foreach (int n in arr) //循环遍历排序后的数组元素并输出
Console.Write(n + " ");
Console.WriteLine();
Console.ReadLine();
}
}
}
/*运行结果:
1 3 4 15 24 63 */
2、直接插入排序
直接插入排序是一种最简单的排序方法,其基本操作是将一个记录插入已排好序的有序表中,从而得到一个新的、记录数增1的有序表,然后再从剩下的关键字中选取下一个插入对象,反复执行直到整个序列有序。
//直接插入排序
//由小到大排序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test4_10
{
class Program
{
static void Main(string[] args)
{
if (args is null) //解除IDE0060
{
throw new ArgumentNullException(nameof(args));
}
int[] arr = new int[] { 63, 4, 24, 1, 3, 15 }; //定义源数组,并赋值
for (int i = 0; i < arr.Length; ++i) //遍历arr
{
int temp = arr[i]; //定义局部变量temp,插入值
int j = i;
while ((j > 0) && (arr[j - 1] > temp)) //只要前面的大于temp,而且也一定至少满足1次
{
arr[j] = arr[j - 1]; //满足条件的前提下,j的每次循环,都把前面的数向后右移一次
--j;
}
arr[j] = temp; //直到不满足条件时跳出while,arr[j] = temp,插入新值完毕
}
Console.WriteLine("排序后结果为:");
foreach (int n in arr) //循环遍历排序后的数组
Console.Write("{0}", n + " ");
Console.WriteLine();
Console.ReadLine();
}
}
}
/*运行结果:
排序后结果为:
1 3 4 15 24 63 */
3、选择排序
选择排序方法的排序速度要比冒泡排序快一些,也是常用的排序算法。
选择排序的基本思想是将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从第一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。
//选择排序:对数组中的元素从小到大进行排序
//IDE0180:使用元組交換值 - .NET | Microsoft Learn
//https://learn.microsoft.com/zh-tw/dotnet/fundamentals/code-analysis/style-rules/ide0180
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test7_11
{
class Program
{
static void Main(string[] args)
{
if (args is null) //解除IDE0060
{
throw new ArgumentNullException(nameof(args));
}
int[] arr = new int[] { 63, 4, 24, 1, 3, 15 }; //源数组并赋值
int min; //局部变量,每次选择排序中的最小值的索引
for (int i = 0; i < arr.Length - 1; i++) //遍历数组
{
min = i; //排序最小值的索引min最开始假设为i
for (int j = i + 1; j < arr.Length; j++) //循环访问数组中的元素值(除第一个)
{
if (arr[j] < arr[min]) //倘若索引i后面的元素值arr[j] < arr[min]
min = j; //就修改最小值的索引min为j
}
//int t = arr[min]; //定义一个int变量,用来存储比较大的数组元素值,
//arr[min] = arr[i]; //将小的数组元素值移动到前一位
//arr[i] = t; //将int变量中存储的较大的数组元素值向后移
(arr[i], arr[min]) = (arr[min], arr[i]); //解除IDE0180使用元组交换值,并注释掉上3行,对应地交换索引位置的数据元素值
} //如果一开始arr[i]就是最小值,那么if不满足条件,min永远也!=j,元祖交换自己等效于不交换
Console.WriteLine("排序后结果为:");
foreach (int n in arr) //遍历显示输出新数组
Console.Write("{0}", n + " ");
Console.WriteLine();
Console.ReadLine();
}
}
}
/*运行结果:
排序后结果为:
1 3 4 15 24 63 */