演算法初探:排序1

來源:互聯網
上載者:User
文章目錄
  •  先就實現這四種排序演算法,後面幾种放在下一個文章中去,實現了這幾個方法,接下來就是測試對比下了
 演算法是程式的靈魂

  演算法的重要性是不言而喻的,儘管.Net類庫封裝了豐富的演算法庫,協助我們去完成各類工作,但我們不能不去瞭解它們,唯有理解了它,我們才會走得更遠。接下來我會抽時間陸續的學習各類演算法,並儘可能的和各位博友分享,由於我算是初探演算法家族,各種不足與淺顯,大家多多提寶貴意見,謝謝。

 排序演算法   演算法定義

  所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序的功能是將一個資料元素(或記錄)的任意序列,重新排列成一個關鍵字有序的序列。

 演算法比較

  根據演算法的空間複雜度和時間複雜度來進行比較。

   演算法分類

   根據排序方法,大致可以分為插入、交換、選擇、合并等類別。

 常見的排序演算法

  排序的演算法有很多,對空間的要求及其時間效率也不盡相同。下面列出了一些常見的排序演算法。插入排序、冒泡排序、選擇排序、快速排序、堆排序、歸併排序、基數排序與希爾排序。下面就不給出各類排序演算法的定義以及基本思想了,百科都有,還是直接上代碼:

  插入排序

   

        public static void InsertSort(int[] arr)        {            int i, j, temp;            int length = arr.Length;            for (i = 1; i < length; i++)            {                temp = arr[i];                for (j = i; j > 0 && arr[j-1] >temp; j--)                {                    arr[j] = arr[j - 1];                }                arr[j] = temp;            }        }
  冒泡排序

  

        public static void BubbleSort(int[] arr)        {            int i, j, temp;            for (i=0; i <= arr.Length - 2; i++)            {                for (j = i+1; j <= arr.Length - 1; j++)                {                    if (arr[i] > arr[j])                    {                        temp = arr[i];                        arr[i] = arr[j];                        arr[j] = temp;                    }                }            }        }

 

  選擇排序

  

        public static void SelectSort(int[] arr)        {            int i, j, temp, min;            for (i = 0; i <= arr.Length - 2; i++)            {                min = i;                for (j = i + 1; j <= arr.Length - 1; j++)                {                    if (arr[j] < arr[min])                    {                        min = j;                    }                }                if (i != min)                {                    temp = arr[min];                    arr[min] = arr[i];                    arr[i] = temp;                }            }        }

 

  快速排序

  

        public static void QuickSort(int[] arr,int low,int high)        {            int i = low;            int j = high;            int temp = arr[low];            while (low < high)            {                while ((low < high) && arr[high] >= temp)                {                    --high;                }                arr[low] = arr[high];                while ((low < high) && arr[low] <= temp)                {                    ++low;                }                arr[high] = arr[low];            }            arr[low] = temp;            if (i < low - 1)            {                QuickSort(arr, i, low - 1);            }            if (j > low + 1)            {                QuickSort(arr, low + 1, j);            }        }

 

 先就實現這四種排序演算法,後面幾种放在下一個文章中去,實現了這幾個方法,接下來就是測試對比下了  隨機產生數組方法

  

        public static int[] RandomArray(int length,int minSize,int maxSize)        {            Random rand = new Random();            int[] arr = new int[length];            for (int i = 0; i <= length - 1; i++)            {                arr[i] = rand.Next(minSize, maxSize);            }            return arr;        }
 測試代碼

  

    class Program    {        public static void Main()        {            Console.WriteLine("首先產生隨機整數數組:");            int[] array = RookieBen.Algorithm.Sort.RandomArray(10000, 0, 50);            Sort("Bubble", (int[])array.Clone());            Sort("Select", (int[])array.Clone());            Sort("Insert", (int[])array.Clone());            Sort("Quick", (int[])array.Clone());            Sort("System",(int[])array.Clone());            Console.ReadKey();        }        public static void Sort(string info,int[] array)        {            Console.WriteLine("下面開始測試RookeBen庫裡的{0}排序演算法",info);            //Console.WriteLine("排序前資料:");            //foreach (int num in array)            //{            //    Console.Write(num + " ");            //}            //Console.WriteLine();            DateTime start, end;            Console.WriteLine("下面開始排序....");            start = DateTime.Now;            switch (info)            {                case "Bubble":                    RookieBen.Algorithm.Sort.BubbleSort(array);                    break;                case "Select":                    RookieBen.Algorithm.Sort.SelectSort(array);                    break;                case "Insert":                    RookieBen.Algorithm.Sort.InsertSort(array);                    break;                case "Quick":                    RookieBen.Algorithm.Sort.QuickSort(array);                    break;                case "System":                    array.ToList().Sort();                    break;            }            end = DateTime.Now;            Console.WriteLine("排序結束");            //Console.WriteLine("排序後的資料:");            //foreach (int num in array)            //{            //    Console.Write(num + " ");            //}            //Console.WriteLine();            Console.WriteLine("排序耗時:{0}", end - start);            Console.WriteLine();            Console.WriteLine();        }    }

 

  上面在控制台上進行了一次簡單的測試,橫向的比較了各個方法的執行效率,最後還有使用系統庫裡的Sort()方法。看看對比效果:

  先是執行結果(附圖:執行了三次):

  

  

  分析:

  從執行結果來看,我們寫得最多的冒泡排序其實是最慢的一種排序演算法了,和直接選擇排序(比冒泡要稍快一點)在一個層次上,四個演算法裡面執行時間最快的當屬快速排序了(別人就叫這個,當然要快了),冒泡排序以及直接選擇排序和它比有十倍以上的差距(執行時間上)也比插入排序要快很多,很理想的一種排序方法。最後就是都有調用庫裡內建的排序方法,結果很是理想,它的指向時間都比我們自己寫的要快,不清楚它採用了何種排序,起碼我們現在知道,它執行很快,我們應該使用它。

 

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.