• 算法学习


    public void test()
    {
    
    //-------------直接插入排序算法
    Console.WriteLine("---------直接插入排序算法------------
    ");
    showArray();
    
    
    // --------------归并排序算法
    Console.WriteLine("---------归并排序算法------------
    ");
    showArray();
    
    // --------------直接选择排序算法
    Console.WriteLine("---------直接选择排序算法------------
     ");
    showArray();
    
    
    //--------------冒泡排序算法
    Console.WriteLine("---------冒泡排序算法 ------------
    ");
    showArray();
    
    }
    private void showArray()
    {
    int[] arr;
    int[] sorted = null;
    arr = BuilderArray.getArray(1000, 5000);
    Console.WriteLine("数组大小:- " + arr.Length + "- 元素为:");
    int index = 1;
    for (int k = 0; k < arr.Length; k++)
    {
    Console.Write(arr[k] + " ,");
    if (index % 10 == 0)
    Console.WriteLine();
    index++;
    }
    
    DateTime begin = DateTime.Now;
    sorted = Sorted.insertSort(arr);
    Console.WriteLine("
    ----- 排序后: : ");
    index = 1;
    for (int m = 0; m < sorted.Length; m++)
    {// 迭代
    Console.Write(sorted[m] + " ,");
    if (index % 15 == 0)
    Console.WriteLine();
    index++;
    }
    DateTime end = DateTime.Now;
    Console.WriteLine("
    -----排序耗时(s) :" + (( end-begin).Milliseconds+"ms"));
    Console.ReadKey();
    }
    
     
    
    public class BuilderArray
    {
    /**
    * 获得随机大小数组方法
    * @param max_index 最大索引
    * @param max_value 最大值
    * @return disorder 返回数组
    */
    public static int[] getArray(int max_index, int max_value)
    {
    Random random = new Random();
    int index = random.Next(max_index);
    int[] disorder = new int[index];//初始化一个随机大小的数组对象
    for (int i = 0; i < index; i++)
    {
    disorder[i] = random.Next(max_value);
    }
    return disorder;
    }
    }
    
    public class Sorted
    {
    
    /**
    * @category 归并排序算法
    * @param disorder 未排序数组
    * @param order 已排序数组
    * @param disorder_length 未排序数组长度
    * @return 排序数组
    */
    public static int[] mergeSort(int[] disorder, int[] order, int disorder_length)
    {
    int h = 1;
    while (h < disorder_length)
    {
    mergeOrder(disorder, order, disorder_length - 1, h);
    h = 2 * h;
    mergeOrder(order, disorder, disorder_length - 1, h);
    h = 2 * h;
    }
    return order;
    }
    
    /**
    * @category 归并排序算法
    * @param disorder 未排序
    * @param order 已排序
    * @param left 左边索引
    * @param right 右边索引
    * @param end 末尾索引
    */
    private static void merge(int[] disorder, int[] order, int left, int right, int end)
    {
    
    int i = left, j = right + 1, k = left;
    while (i <= right && j <= end)
    {
    if (disorder[i] <= disorder[j])
    {
    order[k++] = disorder[i++]; // 取r[i]和r[j]中较小者放入r1[k]
    }
    else
    {
    order[k++] = disorder[j++];
    }
    }
    if (i <= right)
    {
    while (i <= right)
    { // 若第一个子序列处理完,则进行收尾处理
    order[k++] = disorder[i++];
    }
    }
    else
    {
    while (j <= end)
    { // 若第二个子序列处理完,则进行收尾处理
    order[k++] = disorder[j++];
    }
    }
    }
    /**
    * @category 归并排序算法
    * @param disorder 未排序
    * @param order 已排序
    * @param disorder_length 未排序数组长度
    * @param h 
    */
    private static void mergeOrder(int[] disorder, int[] order, int disorder_length, int h)
    {
    int i = 0;
    while (i <= disorder_length - 2 * h)
    { //待归并记录至少有两个长度为h的子序列
    merge(disorder, order, i, i + h - 1, i + 2 * h - 1);
    i += 2 * h;
    }
    if (i < disorder_length - h)
    {
    merge(disorder, order, i, i + h - 1, disorder_length); //待归并序列中有一个长度小于h
    }
    else
    {
    for (int k = i; k <= disorder_length; k++)
    { //待归并序列中只剩一个子序列
    order[k] = disorder[k];
    }
    }
    }
    
    /**
    * @category 快速排序算法
    */
    
     
    
    /**
    * @category 直接插入排序算法
    * @param disorder 数组
    */
    public static int[] insertSort(int[] disorder)
    {
    int temp = 0;//临时变量
    for (int i = 1; i < disorder.Length; i++)
    {
    int j = i - 1;
    temp = disorder[i];
    for (; j >= 0 && temp < disorder[j]; j--)
    {
    disorder[j + 1] = disorder[j];//替换位置
    }
    disorder[j + 1] = temp;
    }
    return disorder;
    }
    
    
    /**
    * @category 直接选择排序算法
    * @param disorder 数组
    */
    public static int[] selectSort(int[] disorder)
    {
    int i, j, index, temp;
    for (i = 0; i < disorder.Length; i++)
    {
    index = i; //初始化第i趟选择排序的最小记录的指针
    for (j = i + 1; j < disorder.Length; j++)
    { //在无序区选取最小记录
    if (disorder[j] < disorder[index])
    {
    index = j;
    }
    }
    if (index != i)
    { //将最小记录与r[i]交换
    temp = disorder[i];
    disorder[i] = disorder[index];
    disorder[index] = temp;
    }
    }
    return disorder;
    }
    
    /**
    * @category 冒泡排序算法(逻辑简单,适用性不强)
    * @param disorder 数组
    */
    public static int[] bubbleSort(int[] disorder)
    {
    int temp = 0;
    for (int i = 0; i < disorder.Length; i++)
    {
    for (int j = 0; j < disorder.Length - i - 1; j++)
    if (disorder[j] > disorder[j + 1])
    { // 进行两两比较,下面进行符合条件的交换
    temp = disorder[j + 1];
    disorder[j + 1] = disorder[j];
    disorder[j] = temp;
    }
    }
    return disorder;
    }
    }
    

      

  • 相关阅读:
    Excel 如何复制粘贴一整行
    如何修改文件的扩展名(后缀)
    中文乱码之myEclipse项目导入时中文乱码(待)
    如何在java中导入jar包
    如何在myEclipse中创建配置文件,比如:XXX.properties
    Postman安装教程
    API是什么?——回答:接口。(待)
    找回J2EE 之再学习打卡记录
    让外界可以访问电脑上的网站的几种方式——花生壳,域名,IIS(待)
    18、任务暂停挂起
  • 原文地址:https://www.cnblogs.com/linsong521/p/4692579.html
Copyright © 2020-2023  润新知