一些常用算法[數組全排列算法,單鏈表反轉(遞歸實現),字符串反轉,桶排序]

using System;
using System.Collections;
using System.Collections.Generic;

namespace Arrange
{
    class Program
    {
        static void Main(string[] args)
        {


            #region 1。全排列算法
            //string[] teststring = new string[] { "a", "b", "c", "d" };

            //Arrage(teststring, 0, teststring.Length);

            //Console.ReadLine();
            #endregion

            #region 2。單鏈表反轉(遞歸)

            //LinkList<int> lk = new LinkList<int>();
            //lk.Append(1);
            //lk.Append(2);
            //lk.Append(3);
            //lk.Append(4);
            //lk.Append(6);
            //lk.Append(7);
            //lk.Append(8);
            //lk.Append(9);

            //Node<int> head = lk.Head;
            //while (head != null)
            //{
            //    Console.Write(string.Format("{0},", head.Data));
            //    head = head.Next;
            //}
            //head = lk.Head;
            //Console.WriteLine();

            //Node<int> reservedlink = Reserve(head);
            //while (reservedlink != null)
            //{
            //    Console.Write(string.Format("{0},", reservedlink.Data));
            //    reservedlink = reservedlink.Next;
            //}
            //Console.WriteLine();

            //Console.ReadLine();

            //return;
            #endregion

            #region 3。字符串反轉
            //string a = "abc";
            
            //Console.WriteLine(a);
            //a = ReserverString(a);
            //Console.WriteLine(a);

            //Console.ReadLine();
            #endregion

            #region 4. QuickSort
            ////int[] intarr = new int[] { 11, 22, 2, 3, 1, 4, 6, 8 };
            //int[] intarr = new int[] { 3, 5, 1, 2, 4, 8, 6, 7, 9, 10, 19, 17, 18, 14, 15, 16, 20, 11, 12, 13 };
            //QuickSort(intarr, 0, intarr.Length - 1);

            //for (int i = 0; i < intarr.Length; i++)
            //{
            //    Console.Write(intarr[i].ToString() + ",");
            //}

            #endregion

            #region 5.桶排序

            int maxnum = 20;
            int nullvalue = 0; //一個標記,確保數組中任何元素的值都不等於這個值。
            int[] intarr = new int[] { 3, 5, 1, 2, 4, 8, 6, 7, 9, 10, 19, 17, 18, 14, 15, 16, 20, 11, 12, 13 };
            TongSort(intarr, maxnum, nullvalue);
            for (int i = 0; i < intarr.Length; i++)
            {
                Console.Write(intarr[i].ToString() + ",");
            }

            #endregion

            Console.ReadLine();
        }

        #region 1。全排列算法

        /// <summary>
        /// 交換
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="i"></param>
        /// <param name="j"></param>
        static void Swap(string[] arr, int i, int j)
        {
            if (i != j)
            {
                string tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }

        /// <summary>
        /// 排列/打印
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="str"></param>
        /// <param name="m"></param>
        static void Arrage(string[] arr, int str, int m)
        {
            if (str == m - 1)
            {
                //print
                foreach (string t in arr)
                    Console.Write(string.Format("{0},", t));
                Console.WriteLine();
            }
            else
            {
                for (int i = str; i < m; i++)
                {
                    Swap(arr, str, i);
                    Arrage(arr, str + 1, m);
                    Swap(arr, str, i);
                }
            }
        }

        #endregion

        #region 2。單鏈表反轉(遞歸)

        #region 反轉算法(遞歸)
        static Node<int> Reserve(Node<int> singlelink)
        {
            if (singlelink.Next == null)
                return singlelink;

            Node<int> l = Reserve(singlelink.Next);
            singlelink.Next.Next = singlelink;
            singlelink.Next = null;
            return l;
        }
        #endregion

        #region 單鏈表結構定義

        //定義單鏈表的結點
        //結點存儲數據和下一個結點的地址(引用).這裏用一個類表示.
        public class Node<T>
        {
            private T data;  //數據
            private Node<T> next; //引用

            //構造器
            public Node(T val, Node<T> p)
            {
                data = val;
                next = p;
            }

            //構造器2
            public Node(Node<T> p)
            {
                next = p;
            }

            //構造器3
            public Node(T val)
            {
                data = val;
                next = null;
            }

            //構造器4
            public Node()
            {
                data = default(T);
                next = null;
            }

            //數據域屬性
            public T Data
            {
                get
                {
                    return data;
                }
                set
                {
                    data = value;
                }
            }

            //引用域屬性
            public Node<T> Next
            {
                get { return next; }
                set { next = value; }
            }
        }


        //單鏈表類--定義操作結點的一些方法(如刪除, 插入等).
        //IList<T>是.net自帶的一個接口. 這裏實現了這個接口.
        public class LinkList<T>
        {
            private Node<T> head;  //單鏈表的頭引用

            //頭引用 屬性
            public Node<T> Head
            {
                get { return head; }
                set { head = value; }
            }

            //構造器
            public LinkList()
            {
                head = null;
            }

            ///<summary>
            ///求單鏈表的長度
            ///需要從表頭開始, 一個結點一個結點遍歷,直到表的末尾.
            ///</summary>

            public int GetLength()
            {
                Node<T> p = head;

                int len = 0;
                while (p != null)
                {
                    ++len;
                    p = p.Next;
                }

                return len;
            }

            ///<summary>
            /// 清空單鏈表
            /// head=null即可.
            /// 單鏈表清空後,原來結點所佔用的空間不會一直保留, 而由垃圾回收器進行回收.
            ///</summary>
            public void Clear()
            {
                head = null;
            }

            ///<summary>
            /// 判斷單鏈表是否爲空
            /// head==null,即爲空
            ///</summary>
            public bool IsEmpty()
            {
                if (head == null)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

            ///<summary>
            ///附加操作
            ///在單鏈表的末尾添加新元素
            /// </summary>
            public void Append(T item)
            {
                Node<T> q = new Node<T>(item);
                Node<T> p = new Node<T>();

                if (head == null)
                {
                    head = q;
                    return;
                }

                p = head;
                while (p.Next != null)
                {
                    p = p.Next;
                }

                p.Next = q;
            }

            //在單鏈表的第 i 個結點位置前插入一個值爲 item 的結點.
            public void Insert(T item, int i)
            {
                if (IsEmpty() || i < 1)
                {
                    Console.WriteLine("List is empty or Position is error!");
                    return;
                }

                //就一個head元素.(插入到head前即可)
                if (i == 1)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = head;
                    return;
                }

                //非head(中間某一元素前插入P)
                Node<T> p = head;
                Node<T> r = new Node<T>();
                int j = 1;

                while (p.Next != null && j < i)
                {
                    r = p;
                    p = p.Next;
                    ++j;
                }

                if (j == i)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = p;
                    r.Next = q;
                }

            }

            //在單鏈表的第 i 個結點的位置後插入一個值爲 item的結點.
            public void InsertPost(T item, int i)
            {
                if (IsEmpty() || i < 1)
                {
                    Console.WriteLine("List is empty or Position is error!");
                    return;
                }

                if (i == 1)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = head.Next;
                    head.Next = q;
                    return;
                }

                Node<T> p = head;
                int j = 1;

                while (p != null && j < i)
                {
                    p = p.Next;
                    ++j;
                }

                if (j == i)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = p.Next;
                    p.Next = q;
                }
            }

            //刪除單鏈表的第 i 個結點
            public T Delete(int i)
            {
                if (IsEmpty() || i < 0)
                {
                    Console.WriteLine("Link is empty or Position is error!");
                    return default(T);
                }

                Node<T> q = new Node<T>();
                if (i == 1)
                {
                    q = head;
                    head = head.Next;
                    return q.Data;
                }

                Node<T> p = head;
                int j = 1;

                //從頭一直找到 i 所在的位置 
                //條件是: (1).單鏈表沒有到末尾, (2).還沒有到 i 所在的位置 ( j< i).
                while (p.Next != null && j < i)
                {
                    ++j;
                    q = p;
                    p = p.Next;
                }

                if (j == i)
                {
                    q.Next = p.Next;
                    return p.Data;
                }
                else
                {
                    Console.WriteLine("The item node is not exist!");
                    return default(T);
                }
            }

            //獲得單鏈表的第 i 個數據元素
            public T GetElem(int i)
            {
                if (IsEmpty())
                {
                    Console.WriteLine("List is empty!");
                    return default(T);
                }

                Node<T> p = new Node<T>();
                p = head;
                int j = 1;

                while (p.Next != null & j < i)
                {
                    ++j;
                    p = p.Next;
                }

                if (j == i)
                {
                    return p.Data;  //找到了.
                }
                else
                {
                    Console.WriteLine("The item node is not exist!");
                    return default(T);
                }
            }

            ///<summary>
            ///在單鏈表中查找值爲 value 的結點
            ///</summary>
            public int Locate(T value)
            {
                if (IsEmpty())
                {
                    Console.WriteLine("List is Empty!");
                    return -1;
                }

                Node<T> p = new Node<T>();
                p = head;
                int i = 1;
                while (!p.Data.Equals(value) && p.Next != null)
                {
                    p = p.Next;
                    ++i;
                }

                return i;
            }
        }
        #endregion

        #endregion

        #region 3。字符串反轉
        static string ReserverString(string str)
        {
            int n = str.Length;
            System.Text.StringBuilder sb = new System.Text.StringBuilder(str);
            
            for (int i = 0; i < n / 2; i++)
            {
                char c = sb[i];
                sb[i] = sb[n - i - 1];
                sb[n - i - 1] = c;
            }
            return sb.ToString();
        }
        #endregion

        #region 4. QuickSort
        static void QuickSort(int[] arr, int low, int high)
        {
            if (low < high)
            {
                int partition = PartitionArr(arr, low, high);
                QuickSort(arr, low, partition - 1);
                QuickSort(arr, partition + 1, high);
            }
        }

        static int PartitionArr(int[] arr, int low, int high)
        {
            int partition = arr[low];

            while (low < high)
            {
                while (high > low)
                {
                    if (arr[high] < partition)
                    {
                        arr[low] = arr[high];
                        low++;
                        break;
                    }
                    else
                    {
                        high--;
                    }
                }
                while (low < high)
                {
                    if (arr[low] > partition)
                    {
                        arr[high] = arr[low];
                        high--;
                        break;
                    }
                    else
                    {
                        low++;
                    }
                }
            }
            arr[low] = partition;
            return low;
        }

        #endregion

        #region 5.桶排序

        static void TongSort(int[] arr, int maxnum, int nullvalue)
        {
            int[] t = new int[maxnum + 1];
            //初始化
            if (nullvalue != 0)
                for (int i = 0; i < t.Length; i++)
                    t[i] = nullvalue;

            for (int i = 0; i < arr.Length; i++)
            {
                t[arr[i]] = arr[i];
            }

            int idx = 0;
            for (int i = 0; i < t.Length; i++)
            {
                if (t[i] != nullvalue)
                {
                    arr[idx++] = t[i];
                }
            }
        }

        #endregion
    }


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章