알고리즘, 구조 응용

23888 단어
최근 에 또 일자 리 를 찾기 시 작 했 습 니 다. 면접, 필기시험 은 불가피 합 니 다. 요 며칠 동안 연습 을 많이 하고 글 을 많이 쓰 며 예전 의 기초 지식 이 약간 손 에 익 었 습 니 다.) int [] iarrary = new int [] {1, 5, 3, 6, 10, 55, 9, 2, 87, 12, 34, 75, 33, 47};
각종 알고리즘 복잡 도:
정렬 법
평균 시간
최 악의 상황
안정 도
추가 공간
비고
거품 이 일다
O(n2)
O(n2)
안정시키다
O(1)
시간
교환 하 다.
O(n2)
O(n2)
불안정
O(1)
시간
선택 하 다.
O(n2)
O(n2)
불안정
O(1)
시간
끼어들다
O(n2)
O(n2)
안정시키다
O(1)
대부분 정렬 되 었 을 때 좋 습 니 다.
기수
O(logRB)
O(logRB)
안정시키다
O(n)
B 는 진수 (0 - 9), R 은 기수 (개 100)
Shell
O(nlogn)
O(ns) 1<2
불안정
O(1)
s 는 선택 한 그룹 입 니 다.
쾌속
O(nlogn)
O(n2)
불안정
O(nlogn)
옛날
병합 하 다
O(nlogn)
O(nlogn)
안정시키다
O(1)
옛날
쌓다
O(nlogn)
O(nlogn)
불안정
O(1)
옛날
1. 거품 정렬 (두 가지 비교)
        public static void sort(int[] list)
        {
            int[] newList = new int[list.Length];
            int copyValue = 0;
            for (int i = 0; i < list.Length - 1;i++)
            {
                for (int j = i + 1; j < list.Length;j++)
                {
                    if(list[i] < list[j])
                    {
                        copyValue = list[i];
                        list[i] = list[j];
                        list[j] = copyValue;
                    }
                }
            }
        }

 
2. 정렬 선택 (최대 색인, 교환 값 선택)
        public static void sort(int[] list)
        {
            int maxIndex = 0;
            for (int i = 0; i < list.Length - 1; i++)
            {
                maxIndex = i;
                for (int j = i + 1; j < list.Length; j++)
                {
                    if (list[j] > list[maxIndex])
                    {
                        maxIndex = j;
                    }
                }
                int maxValue = list[maxIndex];
                list[maxIndex] = list[i];
                list[i] = maxValue;
            }
        }

3. 정렬 삽입 (후 앞으로, Check, 삽입)
  public static void sort(int[] list)
        {
            for (int i = 1; i < list.Length; i++)
            {
                int originValue = list[i];
                int j = i;
                while ((j > 0) && (list[j - 1] > originValue))
                {
                    list[j] = list[j - 1];
                    --j;
                }
                list[j] = originValue;
            }
        }

4. 힐 정렬
     public static void sort(int[] list)
        {
            int inc;
            for (inc = 1; inc <= list.Length / 9; inc = 3 * inc + 1) ;
            for (; inc > 0; inc /= 3)
            {
                for (int i = inc + 1; i <= list.Length; i += inc)
                {
                    int originValue = list[i - 1];
                    int j = i;
                    while ((j > inc) && (list[j - inc - 1] > originValue))
                    {
                        list[j - 1] = list[j - inc - 1];
                        j -= inc;
                    }
                    list[j - 1] = originValue;
                }
            }
        }

 5. 빠르다
///      
         /// </summary>
         /// <param name="list"></param>
         /// <param name="low"></param>
         /// <param name="high"></param>
         public static void Sort(int[] list, int low, int high)
         {
             int pivot;
             int l, r;
             int mid;
             if (high <= low)
                 return;
             else if (high == low + 1)
             {
                 if (list[low] > list[high])
                     Swap(ref list[low], ref list[high]);
                 return;
             }
             mid = (low + high) >> 1;
             pivot = list[mid];
             Swap(ref list[low], ref list[mid]);
             l = low + 1;
             r = high;
             do
             {
                 while (l <= r && list[l] < pivot)
                     l++;
                 while (list[r] >= pivot)
                     r--;
                 if (l < r)
                     Swap(ref list[l], ref list[r]);
             } while (l < r);
             list[low] = list[r];
             list[r] = pivot;
             if (low + 1 < r)
                 Sort(list, low, r - 1);
             if (r + 1 < high)
                 Sort(list, r + 1, high);
         }

6. 귀속
2. 데이터 구조: 1. 뉴스 맥 스 의 앞 순서, 중간 순서, 뒤 순서 가 반복 되 는 실현
--       --#region --       --

    /**//**//**////         ,       
    ///  :              ,            (       )
    public class TreeNode
    {
        private TreeNode leftNode;
        private TreeNode rightNode;
        private int data;

        public TreeNode(int nodeData)
        {
            data = nodeData;
            leftNode = rightNode = null;//    
        }

        public TreeNode LeftNode
        {
            get
            {
                return leftNode;
            }
            set
            {
                leftNode = value;
            }
        }

        public TreeNode RightNode
        {
            get
            {
                return rightNode;
            }
            set
            {
                rightNode = value;
            }
        }

        public int Data
        {
            get
            {
                return data;
            }
            set
            {
                data = value;
            }
        }

        public void Insert(int insertValue)//    
        {
            if (insertValue < data)
            {
                if (leftNode == null)
                    leftNode = new TreeNode(insertValue);
                else
                    leftNode.Insert(insertValue);
            }
            else if (insertValue > data)
            {
                if (rightNode == null)
                    rightNode = new TreeNode(insertValue);
                else
                    rightNode.Insert(insertValue);
            }
        }
    }

    public class Tree
    {
        private TreeNode root;
        public Tree()
        {
            root = null;
        }

        //   
        public void InsertNode(int insertValue)
        {
            lock (this)
            {
                if (root == null)
                    root = new TreeNode(insertValue);
                else
                    root.Insert(insertValue);
            }
        }
        //    
        public void PreorderTraversal()
        {
            lock (this)
            {
                PreorderHelper(root);
            }
        }
        private void PreorderHelper(TreeNode node)//     
        {
            if (node == null)
                return;
            Console.Write(node.Data + " ");
            PreorderHelper(node.LeftNode);
            PreorderHelper(node.RightNode);
        }
        //    
        public void InorderTraversal()
        {
            lock (this)
            {
                InorderHelper(root);
            }
        }
        public void InorderHelper(TreeNode node)
        {
            if (node == null)
                return;
            InorderHelper(node.LeftNode);
            Console.Write(node.Data + " ");
            InorderHelper(node.RightNode);
        }
        //    
        public void PostorderTraversal()
        {
            lock (this)
            {
                PostorderHelper(root);
            }
        }
        public void PostorderHelper(TreeNode node)
        {
            if (node == null)
                return;
            PostorderHelper(node.LeftNode);
            PostorderHelper(node.RightNode);
            Console.Write(node.Data + " ");
        }
    }
        #endregion

2. 가난 한 녀석 - 링크 처리
--      --#region --      --
namespace List
{
    /**//**//**//// <summary>
    /// Summary description for ListNode.
    /// </summary>
    //    
    public class ListNode
    {
        public ListNode(int NewValue)
        {
            Value = NewValue;
        }
        /**//**//**//// <summary>
        ///    
        /// </summary>
        public ListNode Previous;
        /**//**//**//// <summary>
        ///    
        /// </summary>
        public ListNode Next;
        /**//**//**//// <summary>
        ///  
        /// </summary>
        public int Value;
    }

    /**//**//**//// <summary>
    ///    
    ///                   . LIST   ,   ,Head ,Tail,  Current,    ,
    ///   Append ,MoveFrist,MovePrevious,MoveNext,MoveLast ,Delete,InsertAscending,InsertUnAscending ,Clear 
    ///     ,  ,  ,    ,    ,      ,GetCurrentValue()         。
    /// </summary>
    public class Clist
    {
        public Clist()
        {
            //    
            //   
            ListCountValue = 0;
            Head = null;
            Tail = null;
        }
        /**//**//**//// <summary>
        ///    
        /// </summary>
        private ListNode Head;
        /**//**//**//// <summary>
        ///    
        /// </summary>
        private ListNode Tail;
        /**//**//**//// <summary>
        ///     
        /// </summary>
        private ListNode Current;
        /**//**//**//// <summary>
        ///        
        /// </summary>
        private int ListCountValue;
        /**//**//**//// <summary>
        ///       
        /// </summary>
        public void Append(int DataValue)
        {
            ListNode NewNode = new ListNode(DataValue);
            if (IsNull())
            //       
            {
                Head = NewNode;
                Tail = NewNode;
            }
            else
            {
                Tail.Next = NewNode;
                NewNode.Previous = Tail;
                Tail = NewNode;
            }
            Current = NewNode;
            //        
            ListCountValue += 1;
        }
        /**//**//**//// <summary>
        ///        
        /// </summary>
        public void Delete()
        {
            //     
            if (!IsNull())
            {
                //    
                if (IsBof())
                {
                    Head = Current.Next;
                    Current = Head;
                    ListCountValue -= 1;
                    return;
                }
                //    
                if (IsEof())
                {
                    Tail = Current.Previous;
                    Current = Tail;
                    ListCountValue -= 1;
                    return;
                }
                //       
                Current.Previous.Next = Current.Next;
                Current = Current.Previous;
                ListCountValue -= 1;
                return;
            }
        }
        /**//**//**//// <summary>
        ///         
        /// </summary>
        public void MoveNext()
        {
            if (!IsEof()) Current = Current.Next;
        }
        /**//**//**//// <summary>
        ///         
        /// </summary>
        public void MovePrevious()
        {
            if (!IsBof()) Current = Current.Previous;
        }
        /**//**//**//// <summary>
        ///         
        /// </summary>
        public void MoveFrist()
        {
            Current = Head;
        }
        /**//**//**//// <summary>
        ///          
        /// </summary>
        public void MoveLast()
        {
            Current = Tail;
        }
        /**//**//**//// <summary>
        ///         
        /// </summary>
        public bool IsNull()
        {
            if (ListCountValue == 0)
                return true;
            return false;
        }
        /**//**//**//// <summary>
        ///          
        /// </summary>
        public bool IsEof()
        {
            if (Current == Tail)
                return true;
            return false;
        }
        /**//**//**//// <summary>
        ///          
        /// </summary>
        public bool IsBof()
        {
            if (Current == Head)
                return true;
            return false;
        }
        public int GetCurrentValue()
        {
            return Current.Value;
        }
        /**//**//**//// <summary>
        ///          
        /// </summary>
        public int ListCount
        {
            get
            {
                return ListCountValue;
            }
        }
        /**//**//**//// <summary>
        ///     
        /// </summary>
        public void Clear()
        {
            MoveFrist();
            while (!IsNull())
            {
                //      ,     
                Delete();
            }
        }
        /**//**//**//// <summary>
        ///           
        /// </summary>
        public void Insert(int DataValue)
        {
            ListNode NewNode = new ListNode(DataValue);
            if (IsNull())
            {
                //   ,   
                Append(DataValue);
                return;
            }
            if (IsBof())
            {
                //     
                NewNode.Next = Head;
                Head.Previous = NewNode;
                Head = NewNode;
                Current = Head;
                ListCountValue += 1;
                return;
            }
            //    
            NewNode.Next = Current;
            NewNode.Previous = Current.Previous;
            Current.Previous.Next = NewNode;
            Current.Previous = NewNode;
            Current = NewNode;
            ListCountValue += 1;
        }
        /**//**//**//// <summary>
        ///       
        /// </summary>
        public void InsertAscending(int InsertValue)
        {
            //  :InsertValue      
            //    
            if (IsNull())
            {
                //  
                Append(InsertValue);
                return;
            }
            //    
            MoveFrist();
            if ((InsertValue < GetCurrentValue()))
            {
                //    ,   ,  
                Insert(InsertValue);
                return;
            }
            while (true)
            {
                if (InsertValue < GetCurrentValue())
                {
                    //    ,   ,  
                    Insert(InsertValue);
                    break;
                }
                if (IsEof())
                {
                    //    
                    Append(InsertValue);
                    break;
                }
                //        
                MoveNext();
            }
        }
        /**//**//**//// <summary>
        ///       
        /// </summary>
        public void InsertUnAscending(int InsertValue)
        {
            //  :InsertValue      
            //    
            if (IsNull())
            {
                //  
                Append(InsertValue);
                return;
            }
            //    
            MoveFrist();
            if (InsertValue > GetCurrentValue())
            {
                //    ,   ,  
                Insert(InsertValue);
                return;
            }
            while (true)
            {
                if (InsertValue > GetCurrentValue())
                {
                    //    ,   ,  
                    Insert(InsertValue);
                    break;
                }
                if (IsEof())
                {
                    //    
                    Append(InsertValue);
                    break;
                }
                //        
                MoveNext();
            }
        }
    }
}
 #endregion

3. 스 택 작업 실현
namespace StackNameSpace
{
    /**//// <summary>
    /// Class1      。
    /// </summary>
    public class Stack
    {
        --    --#region --    --
        private int count = 0;
        private Node first = null;//     
        public bool Empty
        {
            get
            {
                return (first == null);
            }
        }
        public int Count
        {
            get
            {
                return count;
            }
        }
        public object Pop()//  
        {
            if (first == null)
            {
                throw new InvalidOperationException("Can not pop from an empty stack;");
            }
            else
            {
                object temp = first.Value;
                first = first.Next;
                count--;
                return temp;
            }
        }
        public void push(object o)//  
        {
            first = new Node(o, first);
            count++;
        }
        public Stack()
        {
            //
            // TODO:            
            //
        }
        #endregion
    }
    class Node
    {
        --     --#region --     --
        public Node Next;
        public object Value;
        public Node(object value) : this(value, null) { }
        public Node(object value, Node next)
        {
            Next = next;
            Value = value;
        }
        #endregion
    }
}

3. 기타 알고리즘
1、
--    (   ) --#region --    (   ) --
        public static void heapSort(int[] input)
        {
            int root_count = input.Length / 2;
            for (int i = root_count - 1; i >= 0; i--)
            {
                int left = 0;
                int right = 0;
                if (2 * i + 1 < input.Length) left = input[2 * i + 1];
                if ((2 * i + 2) < input.Length) right = input[2 * i + 2];
                if (left >= right && left > input[i])
                {
                    Sort.swap(ref input[i], ref input[2 * i + 1]);
                    Sort.nodeSort(input, 2 * i + 1, input.Length - 1);
                }
                else if (right >= left && right > input[i])
                {
                    Sort.swap(ref input[i], ref input[2 * i + 2]);
                    Sort.nodeSort(input, 2 * i + 2, input.Length - 1);
                }
            }
            for (int j = input.Length - 1; j > 0; j--)
            {
                Sort.swap(ref input[0], ref input[j]);
                Sort.nodeSort(input, 0, j - 1);
            }
        } 

        public static void nodeSort(int[] input, int index,int end)
        {
            //     
            while ((2 * index + 1) <= end)
            {
                //     
                if ((2 * index + 2) <= end)
                {
                    //    
                    if (input[2 * index + 1] >= input[2 * index + 2] && input[2 * index + 1] > input[index])
                    {
                        Sort.swap(ref input[index], ref input[index * 2 + 1]);
                        index = 2 * index + 1;
                    }
                    //    
                    else if (input[2 * index + 2] >= input[2 * index + 1] && input[2 * index + 2] > input[index])
                    {
                        Sort.swap(ref input[index], ref input[index * 2 + 2]);
                        index = 2 * index + 2;
                    }
                    //    
                    else
                    {
                        return;
                    }
                }
                else
                //      
                {
                    //    
                    if (input[2 * index + 1] > input[index])
                    {
                        Sort.swap(ref input[index], ref input[index * 2 + 1]);
                        index = 2 * index + 1;
                    }
                    else
                    {
                        //    
                        return;
                    }
                }
            }
        }
        #endregion

좋은 웹페이지 즐겨찾기