排序算法(选择+冒泡+插入排序 C#代码编写)

排序算法(选择+冒泡+插入排序 C#)

1、选择排序

算法思路:
一个数组array[N]中
(1)在0~N-1中找到最小数,放到array[0]
(2)在1~N-1中找到最小数,放到array[1]
(3)在2~N-1中找到最小数,放到array[2]

代码实现

public static void Selection(int[] arr)//选择算法,找到数组中最小值,放到[0],继续在剩下的数组元素中找到最小值,放到[1]。。。。。
{
    
    
    if (arr == null || arr.Length < 2)//筛选数组
    {
    
    
        return;
    }
    for (int i = 0; i < arr.Length - 1; i++)//注意,在对于最后一个数时不必再进行比较,如果要比较的话Swap函数就不可以用异或方式来写,会把值变成0
    {
    
    
        int minIndex = i;//初始化最小序号是i
        for (int j = i + 1; j < arr.Length; j++)
        {
    
    
            minIndex = arr[minIndex] > arr[j] ? j : minIndex;
        }
        Swap1(arr, minIndex, i);
    }
}
public static void Swap1(int[] arr, int minIndex, int i)//交换函数
{
    
    
    int mid = arr[minIndex];
    arr[minIndex] = arr[i];
    arr[i] = mid;
}

2、冒泡排序

算法思路
一个数组array[N]
(1)array[0]与array[1]位置比较。array[0]>array[1],两数交换,否则不动
(2)然后比较array[1]和array[2],直到比较array[N-2]和array[N-1],这样过了一趟后,array[N-1]的数字确定了
(3)接下来从array[0]到array[N-2],确定了array[N-2].
(4)array[0]到array[N-3],确定array[N-3]。

代码实现

public static void Bubble(int[] arr)//冒泡排序法
{
    
    
    if (arr == null || arr.Length < 2)//筛选数组
    {
    
    
        return;
    }

    for (int i = arr.Length - 1; i > 0; i--)//交换的趟数
    {
    
    
        for (int j = 0; j < arr.Length - 1; j++)//j<arr.Length-1,防止数组越界,因为有j+1
        {
    
    
            if (arr[j] > arr[j + 1])//比较,大的数字后移,先确定的是最后的数字,即最大的数字
                Swap(arr, j, j + 1);
        }
    }
}
public static void Swap(int[] arr, int minIndex, int i)
{
    
    //这种交换方式虽然快但是容易出问题
    arr[minIndex] = arr[minIndex] ^ arr[i];
    arr[i] = arr[minIndex] ^ arr[i];
    arr[minIndex] = arr[minIndex] ^ arr[i];
}

注:冒泡排序法使用的swap和上面选择排序使用的swap不同,这个交换方法使用了异或运算。在使用异或运算的swap交换时,要确保交换的两个数时两块独立的区域,即两块指向内存为两块东西,如果无法保证不建议使用。

3、插入排序

算法思路:
一个数组array[N]
(1)保证array[0]~array[0]之间有序
(2)保证array[0]~array[1]之间有序,若array[1]<array[0],交换。若是array[1]>=array[0],确保了 array[0]~array[1]之间有序

(3)保证array[0]array[m]之间有序【此时0m-1位置是有序的】
从array[m]位往左边来看,若是array[m]<array[m-1],交换, 再次比较array[m-1]和array[m-2],若是array[m-1]<array[m-2],交换,继续往前比较。若是array[m-1]>=array[m-2],则停止比较(因为已经确定了0~m-2位置的数有序的了), 此时保证了array[0]~array[m]之间有序。
(4)保证array[0]~array[3]之间有序…

代码实现

public static void InsertSort(int[] arr)
{
    
    
    if (arr == null || arr.Length < 2)
    {
    
    
        return;
    }
    for (int i = 1; i < arr.Length; i++)//保证0——i有序
    {
    
    
        for (int j = i - 1; j >= 0 && arr[j] > arr[j+1]; j--)//若左边大于i,调换,不大于的话不用换,因为已经保证了前面是有序的,所以一但不大于则可以中止判断,不必再看看前面
        {
    
    
            Swap1(arr, j, j+1);
        }
    }
}
public static void Swap1(int[] arr, int minIndex, int i)//交换函数
{
    
    
    int mid = arr[minIndex];
    arr[minIndex] = arr[i];
    arr[i] = mid;
}

如有问题,欢迎留言( =•ω•= )m

猜你喜欢

转载自blog.csdn.net/weixin_51565051/article/details/129603564