1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Data;
6
7 namespace TestSample
8 {
9
10 #region explaination
17
18
19 //一、冒泡排序
20
21 //已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],依此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
22
23 //优点:稳定,比较次数已知; 它的时间复杂度为O(n^2)
24
25 //缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。
26
27
28 //二、选择排序
29
30 //已知一组无序数据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]就以升序排列了。
31 //总是假设a【a1】最小
32 //每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法
33
34 //优点:不稳定,比较次数与冒泡排序一样,数据移动次数比冒泡排序少; 它的时间复杂度为O(n^2)
35
36 //缺点:相对之下还是慢。
37
38 //三、插入排序
39
40 //假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.
41
42 //优点:稳定,快; O(n^2)
43
44 //缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。
45
46 //四、缩小增量排序
47
48 //由希尔在1959年提出,又称希尔排序。
49
50 //已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。发现当n不大是,插入排序的效果很好。首先取一增量d(d <n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组依此类推,在各组内用插入排序,然后取d' <d,重复上述操作,直到d=1。
51
52 //优点:快,数据移动少;
53
54 //缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。
55
56 //五、快速排序
57
58 //快速排序是冒泡排序的改进版,是目前已知的最快的排序方法。
59
60 //设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
61
62 //优点:极快,数据移动少;O(nlog n) 期望时间,O(n^2) 最坏情况
63
64 //缺点:不稳定。
65
66 #endregion
67
68 class Program
69 {
70 /// <summary>
71 /// bubble sort
72 /// </summary>
73 /// <param name="array"></param>
74 static void Bsort(int[] array)
75 {
76 //int[] bsort = { 12, 35, 11, 67, 34, 89, 99, 23 };
77 for (int i = 0; i < array.Length; i++)
78 {
79 for (int j = i + 1; j < array.Length; j++)
80 {
81 if (array[j] < array[i])
82 {
83 int temp;
84 temp = array[j];
85 array[j] = array[i];
86 array[i] = temp;
87
88 }
89 }
90 }
91 Console.WriteLine("after the bubble sort, the array as below:");
92 for (int i = 0; i < array.Length; i++)
93 {
94 Console.Write(array[i] + " ");
95 }
96
97 }
98
99 /// <summary>
100 /// select sort
101 /// </summary>
102 /// <param name="array"></param>
103 static void SelectSort(int[] array)
104 {
105 for (int i = 0; i < array.Length; i++)
106 {
107 int temp;
108 int min = array[i];
109 for (int j = i + 1; j < array.Length; j++)
110 {
111 if (min > array[j])
112 {
113 min = array[j];
114 temp = array[i];
115 array[i] = array[j];
116 array[j] = temp;
117 }
118 }
119 }
120 Console.WriteLine("after the select sort, the array as below:");
121 for (int i = 0; i < array.Length; i++)
122 {
123 Console.Write(array[i] + " ");
124 }
125 }
126
127 /// <summary>
128 /// insert sort
129 /// </summary>
130 /// <param name="array"></param>
131
132 static void Isort(int[] array)
133 {
134 int temp;
135 for (int i = 1; i < array.Length; i++)
136 {
137 temp = array[i];
138 int j = i;
139 while (j > 0 && array[j - 1] > temp)
140 {
141 array[j] = array[j - 1];
142 j--;
143 }
144 array[j] = temp;
145
146 }
147 Console.WriteLine("after the Insert sort,the array as below:");
148
149 for (int i = 0; i < array.Length; i++)
150 {
151 Console.Write(array[i] + " ");
152 }
153 }
154
155 static void QuickSort(int[] array,int left,int right)
156 {
157 //左边索引小于右边,则还未排序完成
158 if (left < right)
159 {
160 //取中间的元素作为比较基准,小于他的往左边移,大于他的往右边移
161 int middle = array[(left + right) / 2];
162 int i = left - 1;
163 int j = right + 1;
164 while (true)
165 {
166 while (array[++i] < middle && i < right) ;
167 while (array[--j] > middle && j > 0) ;
168 if (i >= j)
169 break;
170 //Swap(numbers, i, j);
171 int temp = array[i];
172 array[i] = array[j];
173 array[j] = temp;
174 }
175 QuickSort(array, left, i - 1);
176 QuickSort(array, j + 1, right);
177 }
178
179
180
181 }
182
183 static void Main(string[] args)
184 {
185 int[] array = new int[10];
186 List<int> list=new List<int>();
187 Random rd=new Random();
188
189 for(int i=0;i<10;i++)
190 {
191 int next=rd.Next(1,100);
192 if (!list.Contains(next))
193 {
194 list.Add(next);
195 }
196 }
197
198 array = list.ToArray();
199
200 Bsort(array);
201 Console.WriteLine();
202 SelectSort(array);
203 Console.WriteLine();
204 Isort(array);
205 Console.WriteLine();
206 QuickSort(array,0,array.Length-1);
207 Console.WriteLine("after the quick sort,the array as below:");
208
209 for (int m = 0; m < array.Length; m++)
210 {
211 Console.Write(array[m] + " ");
212 }
213
214 }
215 }
216 }