简单的排序算法
冒泡排序:主要是拿数组的两个相邻元素比较大小,然后交换他们之间的位置第一次外层循环确定一个最大(最小值),第二次确定剩余数据中的最大(最小值)依次下去。
代码:
1 int []a={1,5,3,7,8,4,9}; 2 3 4 for (int i = 0; i < a.Length; i++) 5 { 6 Console.Write("{0} ", a[i]); //输出原始数据 7 } 8 9 bool IsAsc = false; // true 是升序,false 是降序 10 Console.WriteLine(); 11 for (int i = 0; i <a.Length-1; i++)//每一次在剩余数据中确定一个最大(最下)存放在a[i],因为最后两个只需要比较一次所以i< a.length-1 12 { 13 for (int j = i+1; j < a.Length; j++) 14 { 15 if (IsAsc? a[i] > a[j]:a[i]<a[j]) //比较a[i]与a[j]满足条件就交互a[i]与a[j]的值。 16 { 17 int temp = a[i]; 18 a[i] = a[j]; 19 a[j] = temp; 20 21 } 22 } 23 } 24 25 26 for (int i = 0; i < a.Length; i++) //输出排序后的结果 27 { 28 Console.Write("{0} ", a[i]); 29 } 30 Console.ReadLine();
简单说明下原理
{1,5,3,7,8,4,9}; 按从大到小排序
i=0,j=1 1与5比 满足条件交换a[0]与a[1] 数组变为 {5,1,3,7,8,4,9}
i=0,j=2 5与3比 不满足条件 继续循环。
i=0,j=3 5与7比 满足条件交换a[0]与a[3] 数组变为 {7,1,3,5,8,4,9}
依次类推,但里面的j循环完后 ,9就到了a[0]的位置
然后 i=1,j=2 又走上面的步骤。8就到了a[1]的位置。
当i=6时退出循环所有的数也排好了。
选择排序:顾名思义,每一次循环选择一个满足条件的数据放到对应的位置。比如第一循环 找到最大值下标与a[0]交换,第二次 找到剩余数据最大值下标 与a[1]交换 依次类推。
代码:
1 int []a={1,5,3,7,8,4,9}; 2 3 4 for (int i = 0; i < a.Length; i++) 5 { 6 Console.Write("{0} ", a[i]); 7 } 8 9 bool IsAsc = true; 10 Console.WriteLine(); 11 12 for (int i = 0; i <a.Length-1; i++) 13 { 14 int index = i; //默认下标为i的就是满足条件 15 for (int j = i+1; j < a.Length; j++) 16 { 17 if (IsAsc? a[index] > a[j]:a[index]<a[j]) //每次下标为j的满足条件 就把index记录为j. 18 { 19 index = j; 20 } 21 } 22 23 if (index != i) //当index不等于i时说明找到了真的满足条件(找到了真正的最大(最小)值下标)就与下标为i的数进行交换 24 { 25 int temp = a[i]; 26 a[i] = a[index]; 27 a[index] = temp; 28 } 29 30 } 31 32 33 for (int i = 0; i < a.Length; i++) 34 { 35 Console.Write("{0} ", a[i]); 36 } 37 Console.ReadLine();
简单说明下原理
{1,5,3,7,8,4,9}; 按从大到小排序
i=0 找到最大的下标6(9) a[0]与a[6]交换 数组变为 {9,5,3,7,8,4,1}
i=1 找到剩余数中最大值下标 4(8) a[1]与a[4]交换 数组变为{9,8,3,7,5,4,1}
依次类推...
快速排序: 在数组中取任意一个数(一般取a[0])将数组比这个数大的放一边,小的放另一边,然后 把数组大的一边和小的一边又按前面的重复,直到每一边只剩一个数。
快速排序用到了递归(方法自己调用自己),如有不懂可以查资料
代码:
1 int []a={1,5,3,7,8,4,9}; 2 3 4 for (int i = 0; i < a.Length; i++) 5 { 6 Console.Write("{0} ", a[i]); 7 } 8 9 bool IsAsc = true; // true 升序 ,false 降序 10 Console.WriteLine(); 11 Order(0, a.Length-1, a,IsAsc); //第一划分是整个数组所以是0-a.length-1 12 13 for (int i = 0; i < a.Length; i++) 14 { 15 Console.Write("{0} ", a[i]); 16 } 17 Console.ReadLine(); 18
上面是main 方法体 ,下面是Order方法
1 void Order(int left,int right,int []a,bool IsAsc) 2 { 3 4 if (left >=right) return; //左边的下标不能大于右边的下标 5 int low = left; //记录左边下标 6 int hight = right; //记录右边下标 7 int Val = a[left]; //默认取左边的第一值,第一次是a[0] 8 while (left < right) 9 { 10 while (left < right && (IsAsc ? a[right] > Val : a[right]<Val)) 11 { 12 right--; 13 } 14 15 if (left < right) 16 { 17 a[left] = a[right]; 18 left++; 19 20 } 21 22 while (left < right && (IsAsc ? a[left] < Val : a[left]>Val)) 23 { 24 left++; 25 } 26 27 if (left < right) 28 { 29 a[right] = a[left]; 30 right--; 31 32 } 33 } 34 35 if (left == right) 36 { 37 a[left] = Val; 38 } 39 //以上将下标 left到right 之间的数 按 Val 分成三块:下标[low到(left-1)]{ 都大(小)于a[left]} ,[left(right)],[right+1,hight]{ 都小(大)于 a[left]} 40 //上面执行完 left是等于right的 41 firstOrder(low, right - 1, a,IsAsc); //重新比较第一块 42 firstOrder(left + 1, hight, a,IsAsc);//重新比较第三块 43 44 }
以上都是个人理解,如有错误深感抱歉。