首页 > 代码库 > C#中的个别排序方法

C#中的个别排序方法

 

                   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 = 0; 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; 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 = http://www.mamicode.com/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     }

 

    


 

 

 

                                                  ***********************未待完续,持续更新****************************

 

 

 

---恢复内容结束---

C#中的个别排序方法