zoukankan      html  css  js  c++  java
  • C# 基础排序与查找算法

    排序算法:

        class Sort
        {
            static void swap<T>(ref T a, ref T b)
            {
                T tmp = a;
                a = b;
                b = tmp;
            }
    
            #region 冒泡排序
            public static void Bubble(ref int[] arr)
            {
                for (int i = 0; i < arr.Length - 1; i++)
                    for (int j = i + 1; j < arr.Length; j++)
                        if (arr[i] > arr[j])
                            swap(ref arr[i], ref arr[j]);
            }
            //其它数据类型同上
            public static void Bubble(ref string[] arr)
            {
                for (int i = 0; i < arr.Length - 1; i++)
                    for (int j = i + 1; j < arr.Length; j++)
                        if (arr[i].CompareTo(arr[j]) > 0)
                            swap(ref arr[i], ref arr[j]);
            }
            #endregion
    
            #region 选择排序
            public static void Select(ref int[] arr)
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    int min = i;
                    for (int j = i + 1; j < arr.Length; j++)
                        if (arr[j] < arr[min])
                            min = j;
                    swap(ref arr[i], ref arr[min]);
                }
            }
            //其它数据类型同上
            #endregion
    
            #region 插入排序
            public static void Insert(ref int[] arr)
            {
                for (int i = 1; i < arr.Length; i++)
                {
                    int tmp = arr[i];
                    int j = i;
                    while (j > 0 && arr[j - 1] >= tmp)
                    {
                        arr[j] = arr[j - 1];
                        j--;
                    }
                    arr[j] = tmp;
                }
            }
            //其它数据类型同上
            #endregion
        }

    查找算法

        class Search
        {
            static void swap<T>(ref T a, ref T b)
            {
                T tmp = a;
                a = b;
                b = tmp;
            }
    
            #region 顺序查找
            public static int SeqIndex(int[] arr, int val)
            {
                for (int i = 0; i < arr.Length; i++)
                    if (arr[i] == val)
                        return i;
                return -1;
            }
            public static int FindMin(int[] arr)
            {
                int min = arr[0];
                for (int i = 1; i < arr.Length; i++)
                    if (arr[i] < min)
                        min = arr[i];
                return min;
            }
            public static int FindMax(int[] arr)
            {
                int max = arr[0];
                for (int i = 1; i < arr.Length; i++)
                    if (arr[i] > max)
                        max = arr[i];
                return max;
            }
    
            //自组织数据加快顺序查找速度,二八原则,常用的前移
            public static int CustSeqIndex(ref int[] arr, int val)
            {
                for (int i = 0; i < arr.Length; i++)
                    if (arr[i] == val)
                    {
                        if (i > arr.Length * 0.2)
                        {
                            swap(ref arr[i], ref arr[i - 1]);
                            return i - 1;
                        }
                        else return i;
                    }
                return -1;
            }
            #endregion
    
            #region 二叉查找 须对有序数组
            public static int BinaryFind(int[] arr, int val)
            {
                int min = 0, max = arr.Length - 1;
                while (min <= max)
                {
                    int mid = (min + max) / 2;
                    if (arr[mid] < val)
                        min = mid + 1;
                    else if (arr[mid] > val)
                        max = mid - 1;
                    else return mid;
                }
                return -1;
            }
            //用递归法重写上述功能,效率没上面循环方法高
            public static int RBinaryFind(int[] arr, int val, int min, int max)
            {
                if (min > max)
                    return -1;
                else
                {
                    int mid = (min + max) / 2;
                    if (arr[mid] == val)
                        return mid;
                    else
                    {
                        if (arr[mid] < val)
                            min = mid + 1;
                        else max = mid - 1;
                        return RBinaryFind(arr, val, min, max);
                    }
                }
            }
            #endregion
        }
  • 相关阅读:
    分布式全局ID生成器设计
    对volatile不具有原子性的理解
    理解单链表的反转(java实现)
    Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践
    Java 重载方法的匹配规则-含有变长参数方法的匹配
    为什么会产生jar包冲突,如何排查jar包冲突?
    SpringBoot 整合mongoDB并自定义连接池
    Java使用Optional与Stream来取代if判空逻辑(JDK8以上)
    多级树的深度优先遍历与广度优先遍历(Java实现)
    Maven pom.xml 全配置(一)常用配置
  • 原文地址:https://www.cnblogs.com/lged/p/5889814.html
Copyright © 2011-2022 走看看