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

评论