【黑馬程序員】3.C#基礎之排序方法總結

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

1.     冒泡排序法

冒泡排序法的思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。

在第二趟:仍從第一對數開始比較(因爲可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。

如此下去,重複以上過程,直至最終完成排序。

下面用一個例子來演示冒泡排序法的執行過程:

    原始順序:60,30,80,10,70,20,50,90,40

    第一趟:30,60,10,70,20,50,80,40,90

    第二趟:30,10,60,20,50,70,40,80,90

    第三趟:10,30,20,50,60,40,70,80,90

    第四趟:10,20,30,50,40,60,70,80,90

    第五趟:10,20,30,40,50,60,70,80,90

    第六趟:10,20,30,40,50,60,70,80,90

    第七趟:10,20,30,40,50,60,70,80,90

    第八趟:10,20,30,40,50,60,70,80,90

小結一下:

1)        用冒泡排序,n 個數需要進行n-1 趟外層循環;

2)        j 趟循環中需要進行n-j次兩兩比較(內循環)。

代碼:

      static void Main(string[] args)
      {
            int[] a = { 60, 30, 80, 10, 70, 20, 50, 90, 40 };
            int[] sorted1 = BubbleSort(a);  //調用冒泡排序方法
              Console.WriteLine("從小到大排序,冒泡排序法得到的結果爲:");
            for (int i = 0; i < sorted1.Length; i++)//循環輸出排序後的數組元素
              {
                Console.Write(sorted1[i] + " ");
            }
            Console.ReadKey();
          }
          public static int[] BubbleSort(int[] arr)//冒泡排序法
       	  {
            int temp;
            for (int i = 0; i < arr.Length - 1; i++)//外層循環控制趟數,循環一次表示比較了一趟
              {
                for (int j = 0; j < arr.Length - 1 - i; j++)//內層控制第i趟需要進行的兩兩比較的次數
                  {
                    if (arr[j] > arr[j + 1])
                    {
                        temp = arr[j];//交換位置,把較大數放到後邊
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            return arr;
         }

輸出:

2.     選擇排序法

選擇排序的思想:已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[1]與a[3]的值,若a[1]大於a[3]則交換兩者的值,否則不變。再比較a[1]與a[4],以此類推,最後比較a[1]與a[n]的值。這樣處理一輪後,a[1]的值一定是這組數據中最小的。再將a[2]與a[3]~a[n]以相同方法比較一輪,則a[2]的值一定是a[2]~a[n]中最小的。再將a[3]與a[4]~a[n]以相同方法比較一輪,以此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。

代碼:                  

	static void Main(string[] args)
        {
            int[] b= { 40, 90, 10, 70, 50, 80, 20, 60, 30 };
            int[] sorted2=SelectionSort(b);//調用選擇排序法
              Console.WriteLine("從小到大排序,選擇排序法得到的結果爲:");
            for (int i=0; i<sorted2.Length; i++)
            {
                Console.Write(sorted2[i] +" ");
            }
            Console.ReadKey();
        }
        public static int[] SelectionSort(int[] arr)//選擇排序法
         {
            int min;
            for (int i=0; i<arr.Length-1; i++) //控制循環的趟數
              {
                min=i;
                for (int j=i+1; j<arr.Length ; j++)
                {
                    if (arr[j] <arr[min])
                        min=j;
                }
                int temp=arr[min]; //交換位置,把較小數放到arr[min]的位置
                  arr[min] =arr[i];
                arr[i] =temp;
            }
            return arr;
        } 

輸出:

3.     插入排序法

插入排序算法執行過程:

⒈ 從第一個元素開始,該元素可以認爲已經被排序

⒉ 取出下一個元素,在已經排序的元素序列中從後向前掃描

⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置

⒋ 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

⒌ 將新元素插入到下一位置中

⒍ 重複步驟2

代碼:

        static void Main(string[] args)
        {
            int[] c= { 3, 1, 8, 5, 0, 4, 2, 9, 7, 6 };
            int[] sorted3=InsertionSort(c);//調用插入排序法
              Console.WriteLine("從小到大排序,插入排序法得到的結果爲:");
            for (int i=0; i<c.Length; i++)
            {
                Console.Write(sorted3[i]+" ");
            }
            Console.ReadKey();
        }
        public static int[] InsertionSort(int[] list)
        {
            for (int i=1; i<list.Length; i++)
            {
                int t=list[i];//要插入的數
                  int j=i;//定義遊標
                  //要插入的數字從後向前與每一個元素依次進行比較
                  while ((j>0) && (list[j-1] >t))//如果前一個元素大於要插入的t
                {
                    list[j] =list[j-1];//使前一個元素(較大的)後¨移一位
                       --j;//遊標向前走,繼續與前邊的元素進行比較?
                }
                list[j] =t;//如果前一個元素不大於t,則把t插入到該元素之後這個位置
              }
            return list;
        }

輸出:

 

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

詳細請查看:http://edu.csdn.net

 

發佈了33 篇原創文章 · 獲贊 5 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章