-------- 2016-10-23
***************************************************************************************************
对比相邻的元素值,满足条件就交换两个元素的位置,把较小的移到数组前边,较大的数移到数组后边,这样较小的元素就像气泡上升到前面,较大的像气泡移到后边。
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 }
(本人的理解)操作一:将第一位数假设为最大值或者最小值与后边的数进行比较,而后将最大的值或者最小的值和第一位的数交换
操作二:将第二位数和他后边的数进行比较交换,重复操作一。
以此类推,排序。
【选择排序(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 }
直接排序是从第一位元素开始,依次取第二个数及其后边的数与前边的数比较进行分批次排序的。
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 }
操作一:一列数,先把第一位数看做是基准数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 }
***********************未待完续,持续更新****************************
---恢复内容结束---