C#算法
记录一下手搓算法,现在是2025.11.21,看下能学多少个
排序算法
冒泡排序
static void Main(string[] args)
{
Random a = new Random();
int[] arr = new int[20]; //
for (int i = 0; i < 20; i++) // 创建一个数组,包含20个0-100的随机数字
{ //
arr[i] = a.Next(0,101);
Console.Write(arr[i] + " ");
}
bool isSwap = false; //优化1:外部声明一个布尔值,用于记录是否交换,如果交换过就跳过一轮
Console.WriteLine();
for (int i = 0;i < arr.Length;i++) //轮循环
{
isSwap = false;//进来一轮默认没有交换
for (int j = 0; j < arr.Length - 1 - i;j++) //交换循环
{ //优化2:减去轮数i,这样就不会交换已经确定位置的数字
if (arr[j] > arr[j + 1])
{
isSwap = true; //通过交换判断后 记录bool值为true(已交换)
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if(!isSort)
{
break; //如果没有通过交换判断 说明已经不需要排序 break跳出轮循环
}
}
for(int i = 0;i < arr.Length;i++)
{
Console.Write(arr[i] + " ");
}
}
选择排序
static void Main(string[] args)
{
Random a = new Random();
int[] arr = new int[20]; //
for (int i = 0; i < 20; i++) //创建一个拥有20个0-100随机数的数组
{ //
arr[i] = a.Next(0,101);
Console.Write(arr[i] + " ");
} // 打印出来排序前的数值 !C
Console.WriteLine();
for (int m = 0; m < arr.Length; m++) // 外层轮数循环 循环次数为数组长度
{
int index = 0; //创建初始索引值 从0开始交换
for (int n = 1; n < arr.Length - m; n++) //判断是否交换索引值的循环 减去轮数以防判断已经固定好位置的数
{
if (arr[index] < arr[n]) // 数组[0]和数组[1]去比较大小,如果[1]比[0]大则交换索引值,
{ // 如果[1]比[0]大,后面就是[1]和[2]判断,以此类推,
index = n; // 如果[2]比[1]大 后面就是[2]和[3]判断,index等于一个小容器,
} // 负责带着一轮循环里最大的数字往前判断,
} // !注意:听起来有点像冒泡排序,但本质不同,
if (index != arr.Length - 1 - m) // 冒泡靠左右比较直到排序成功,
{ // 选择靠索引值带着最大的数比较数组的每一个值,直到比较完成。
//交换一轮遍历后的最大值,把最大值放到数组最上方
int temp = arr[index];
arr[index] = arr[arr.Length - 1 - m]; //[arr.Length - 1 - m]是当前轮数组的最后一个索引,
arr[arr.Length - 1 - m] = temp; //所以这里是把index记录到的最大值放到数组的最后一个。
}
}
for (int i = 0; i < 20; i++)
{
Console.Write(arr[i] + " ");
} //最后打印出来排序后的数值 !C
评论