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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...