C#中的個別排序方法

来源:http://www.cnblogs.com/awen001/archive/2016/10/23/5988905.html
-Advertisement-
Play Games

C#學習中的一些演算法排序,不完整, @^_^@ 2016-10-23 ****************************************************************************************** 1.冒泡排序 是將對數組相鄰的元素進行比較,將最 ...


 

                   C#學習中的一些演算法排序,不完整, @^_^@

                                                                 -------- 2016-10-23  

 

        ******************************************************************************************

1.冒泡排序

  是將對數組相鄰的元素進行比較,將最大的數或最小的數向後移動,就像氣泡一樣一步一步的移動,這樣迴圈多次直至排好序列。

 1     class Program
 2     {
 3         static void Maopao(int[] arr)
 4         {
 5             bool f = false;
 6             do
 7             {
 8                 f = false;
 9                 for (int i = 1; i < arr.Length - 1; i++)  
10                 {
11                     if (arr[i] > arr[i + 1])
12                     {
13                         int temp = arr[i];
14                         arr[i] = arr[i + 1];
15                         arr[i + 1] = temp;
16                         f = true;
17                     }
18                 }
19             } while (f);
20         } 
21         static void Main(string[] args)
22         {
23             int[] list = new int[] { 2, 5, 1, 8, 45, 23, 20, 12 };
24             Maopao(list);
25             foreach (var item in list)
26             {
27                 Console.WriteLine(item);
28             }
29             Console.ReadKey();
30         }
31     }

 

 1     class Program
 2     {
 3         static void Maopao(int[] arr)
 4         {
 5             for (int i = 1; i < arr.Length-1; i++)
 6             {
 7                 for (int j = 0; j < arr.Length-i; j++)
 8                 {
 9                     if(arr[j] > arr[j+1])
10                     {
11                         int temp = arr[j];
12                         arr[j] = arr[j + 1];
13                         arr[j + 1] = temp;
14                     }
15                 }
16             }
17         }
18         static void Main(string[] args)
19         {
20             int[] list = new int[] { 2, 5, 1, 8, 45, 23, 20, 12 };
21             Maopao(list);
22             foreach (var item in list)
23             {
24                 Console.WriteLine(item);
25             }
26             Console.ReadKey();
27         }
28     }

 

 2.選擇排序

  (本人的理解)操作一:將第一位數假設為最大值或者最小值與後邊的數進行比較,而後將最大的值或者最小的值和第一位的數交換

          操作二:將第二位數和他後邊的數進行比較交換,重覆操作一。

         以此類推,排序。

 【選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的數據元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第一個[5]與[3]交換,導致第一個5挪動到第二個5後面)。】

 

 1     class Program
 2     {
 3         static void SelectSort(int[] arr)
 4         {
 5             int length = arr.Length;
 6             for (int i = 0; i < length-1; i++)
 7             {
 8                 int temp=arr[i];//元素值
 9                 int em=i;//索引
10                 for (int j = i+1; j < length; j++)
11                 {
12                     if (arr[j] < temp)
13                     {
14                         temp = arr[j];
15                         arr[j] = arr[em];
16                         arr[em] = temp;
17                     }
18                 }
19             }
20         }
21         static void Main(string[] args)
22         {
23             int[] list = new int[] { 2, 5, 1, 8, 45, 23, 20, 12 };
24             SelectSort(list);
25             foreach (var item in list)
26             {
27                 Console.WriteLine(item);
28             }
29             Console.ReadKey();
30         }
31     }

 

 1     class Program
 2     {
 3         static void SelectSort(int[] arr)
 4         {
 5             int length = arr.Length;
 6             for (int i = 0; i < length-1; i++)
 7             {
 8                 int min=arr[i];//元素值
 9                 int em=i;//索引
10                 for (int j = i+1; j < length; j++)
11                 {
12                     if (arr[j] < min)
13                     {
14                         min = arr[j];
15                         em = j;
16                     }
17                 }
18                 if(em != i)
19                 {
20                     int temp = arr[i];
21                     arr[i] = arr[em];
22                     arr[em] = temp;
23                 }
24             }
25         }
26         static void Main(string[] args)
27         {
28             int[] list = new int[] { 2, 5, 1, 8, 45, 23, 20, 12 };
29             SelectSort(list);
30             foreach (var item in list)
31             {
32                 Console.WriteLine(item);
33             }
34             Console.ReadKey();
35         }
36     }

 

3.直接排序

  直接排序從開頭處開始,先取第二位數為基準數(因為第一位數前邊沒有數,無法比較),讓他與它前邊的數比較大小,交換位置;取第三位數為基準數,讓它與前邊已經排好的序列比較大小,而後將第三位數放在符合條件的位置,繼續下一步操作,直至排完。

 1     class Program
 2     {
 3         static void DirectSort(int[] arr)
 4         {
 5             int length = arr.Length;
 6             bool f = false;
 7             for (int i = 1; i < length; i++)
 8             {
 9                 int temp = arr[i];//保留i的位置,避免被覆蓋
10                 f = false;
11                 //拿到i位置的元素,和前面所有元素比較,發現比i大的就向後移動
12                 for (int j = i-1; j >= 0; j--)//從後向前
13                 {
14                     if (arr[j] > temp)
15                     {
16                         arr[j + 1] = arr[j];//向後移動
17                     }
18                     else
19                     {
20                         arr[j + 1] = temp;
21                         f = true;
22                         break;
23                     }
24                 }
25                 if(f==false)
26                 {
27                     arr[0] = temp;
28                 }
29             }
30         }
31         static void Main(string[] args)
32         {
33             int[] list = new int[] { 2, 5, 1, 8, 45, 23, 20, 12 };
34             DirectSort(list);
35             foreach (var item in list)
36             {
37                 Console.WriteLine(item);
38             }
39             Console.ReadKey();
40         }
41     }

 

4.快速排序法

  操作一:一列數,先把第一位數看做是基準數A(標兵),把小於A的數放在A的左邊,大於A的數放在右邊;

  操作二:再將左邊和右邊的數列分別重覆操作一

  以此類推,直至排好

 1     class Program
 2     {
 3         /// <summary>
 4         /// 對數組arrea中索引從left到right之間的數做排序
 5         /// </summary>
 6         /// <param name="arrea">要排序的數組</param>
 7         /// <param name="left">要排序數據的開始索引</param>
 8         /// <param name="right">要排序數據的結束索引</param>
 9         static void QuickSort(int[] arrea, int left, int right)
10         {
11             if (left < right)//left到right之間的數據做排序
12             {
13                 //首先取得一個基準數,把比他小或者等於他的放在它的左邊,然後把比他大的放在它的右邊
14                 int temp = arrea[left];
15                 int i = left;
16                 int j = right;//用來做迴圈的標誌位
17                 while (true && i < j)//當i==j時候,表示找到了一個中間位置,這個中間位置就是基準數應該所在的位置
18                 {
19                     //排序。從後向前進行比較,將後邊的比基準書小或者等於的放到前邊
20                     while (true && i < j)//j不能無限制的小下去
21                     {
22                         if (arrea[j] <= temp)
23                         {
24                             arrea[i] = arrea[j];
25                             break;
26                         }
27                         else
28                         {
29                             j--;
30                         }
31                     }
32                     //從前往後,找一個比temp大的數字,放入後邊剛剛調走的地方
33                     while (true && i < j)
34                     {
35                         if (arrea[i] > temp)
36                         {
37                             arrea[j] = arrea[i];
38                             break;
39                         }
40                         else
41                         {
42                             i++;
43                         }
44                     }
45                 }
46                 //跳出迴圈,現在i==j,i是中間位置 
47                 arrea[i] = temp;
48                 //對第一次大迴圈後的序列的左右兩個區間分別進行排序
49                 QuickSort(arrea, left, i - 1);//對左邊進行排序
50                 QuickSort(arrea, i + 1, right);//對右邊進行排序
51             }
52         }
53         static void Main(string[] args)
54         {
55             int[] data = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };
56             QuickSort(data, 0, data.Length - 1);
57             foreach (var item in data)
58             {
59                 Console.WriteLine(item);
60             }
61             Console.ReadKey();
62         }
63     }

 

 

5.插入排序法

 1     class Program
 2     {
 3         static void InsertSort(int[] arr)
 4         {
 5             for (int i = 0; i < arr.Length; i++)
 6             {
 7                 int temp = arr[i];
 8                 int em = i;
 9                 //讓符合(em > 0) && (arr[em - 1] > temp)這個條件的數與前一位數交換。
10                 //而後--em後讓之前的滿足這個條件的數列重覆這個迴圈,直到不符合條件為止
11                 while ((em > 0) && (arr[em - 1] > temp))
12                 {
13                     arr[em] = arr[em - 1];
14                     --em;//先自減,再使用
15                 }
16                 arr[em] = temp;
17             }
18         }
19         static void Main(string[] args)
20         {
21             int[] arrea = new int[] { 2, 1, 5, 8, 3, 12, 56, 13, 54, 85, 25 };
22             InsertSort(arrea);
23             foreach (var item in arrea)
24             {
25                 Console.WriteLine(item);
26             }
27             Console.ReadKey();
28         }
29     }

 

    


 

                                       #####################################################

                                                                                   ……未待完續……
                                                                            ……若有見解,歡迎補充!……

                                       #####################################################


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 看院子里對EF框架和MySql的配置文章不少,但是幾乎出自一篇文章的轉載,而且這篇轉載的文章的也比較坑爹,下麵我將介紹一下我的配置過程: 第一步:安裝mysql-connector-net-6.9.9.msi(必須首先安裝這個,否則會報框架不相容的錯誤,之前有坑爹的文章沒有強調這一點,結果怎麼也走不 ...
  • var 是3.5新出的一個定義變數的類型 其實也就是弱化類型的定義 VAR可代替任何類型 編譯器會根據上下文來判斷你到底是想用什麼類型的 至於什麼情況下用到VAR 我想就是你無法確定自己將用的是什麼類型 就可以使用VAR 類似 OBJECT 但是效率比OBJECT高點。 或者通俗的講: var可以理 ...
  • DataGrid 配置表頭 欄位 中文 說明 Field 欄位 註意:mg_ 開頭的欄位為層級表頭 Title 列稱 OrderNum 序號 顯示的順序(凍結和非凍結列是兩個組的序號) Width 列寬 設置的寬度(在自適應屏幕時最後的欄位無效) dg.options.fitColumns屬性決定( ...
  • AJAX AJAX = Asynchronous JavaScript and XML(非同步的 JavaScript 和 XML)。 AJAX 不是新的編程語言,而是一種使用現有標準的新方法。 AJAX 是與伺服器交換數據並更新部分網頁的藝術,在不重新載入整個頁面的情況下。 通過在後臺與伺服器進行少 ...
  • ASP.NET Aries JSAPI 文檔說明:AR.Form、AR.Combobox ...
  • ASP.NET Aries JSAPI 文檔說明:AR.Utility ...
  • 最近新學的,C#中得三層架構 ————2016-10-23 表示層 業務邏輯層(BLL) 數據訪問層(DAL) 關聯:產生依賴關係 描述:三層體繫結構就是在客戶端和資料庫之間加一個中間層,通常情況下客戶端不能直接和資料庫進行交互,而是通過中間層和數據層進行交互的。 【表示層】 主要負責完成用戶和系統 ...
  • 在C#中,用於存儲的結構較多,如:DataTable,DataSet,List,Dictionary,Stack等結構,各種結構採用的存儲的方式存在差異,效率也必然各有優缺點。現在介紹一種後進先出的數據結構。 談到存儲結構,我們在項目中使用的較多。對於Task存儲結構,棧與隊列是類似的結構,在使用的 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...