排序

 1 /*插入排序(insert Sort)   O(n^2)*/
 2         public List<int> InsertSort(int[] arr)
 3         {
 4             List<int> tempArr = new List<int>();
 5             tempArr.Add(arr[0]);
 6             bool flag = false;
 7             for (int i = 1; i < arr.Length; i++)
 8             {
 9                 for (int j = 0; j < tempArr.Count; j++)
10                 {
11                     if (arr[i] < tempArr[j])
12                     {
13                         tempArr.Insert(j, arr[i]);
14                         flag = true;
15                         break;
16                     }
17                 }
18                 if (!flag)
19                 {
20                     tempArr.Add(arr[i]);
21                 }
22                 flag = false;
23             }
24             return tempArr;
25         }
  1 /*归并排序(merge Sort)  O(nlog2(n))  非递归*/
  2         public List<int> MergeSort(int[] arr) 
  3         {
  4             List<int> tempArr = new List<int>();//保存最后得到的数组
  5             int twoDouble = 2;//保存2的幂次方
  6             List<int> preArr = new List<int>();//保存前一个数组
  7             for(int i=0;i<arr.Length;i++){
  8                 preArr.Add(arr[i]);
  9             }
 10             while (arr.Length > twoDouble/2)//当数组的长度小于2的幂次方的长度时,终止
 11             {
 12                 List<int> subArr = new List<int>();//拿到合并后的数组
 13                 tempArr.Clear();
 14                 if (arr.Length / twoDouble > 0)//不是最后一组
 15                 {
 16                     for (int i = 0; i < arr.Length / twoDouble; i++)
 17                     {//一定可以有2个或以上的组,而且是可以平分的
 18                         List<int> leftArr = new List<int>();
 19                         List<int> rightArr = new List<int>();
 20                         for (int j = i * twoDouble; j < (i * twoDouble + twoDouble / 2); j++)
 21                         {
 22                             leftArr.Add(preArr[j]);
 23                         }
 24                         for (int j = (i * twoDouble + twoDouble / 2); j < (i * twoDouble + twoDouble); j++)
 25                         {
 26                             rightArr.Add(preArr[j]);
 27                         }
 28                         subArr = MergeSortSubProgram(leftArr, rightArr);
 29                         for (int j = 0; j < subArr.Count; j++) //将拿到的合并后的数组添加到preArr
 30                         {
 31                             tempArr.Add(subArr[j]);
 32                         }
 33                         subArr.Clear();
 34                     }
 35                     if ((arr.Length - (arr.Length / twoDouble) * twoDouble) <= twoDouble / 2)//如果最后的数不能分为2组
 36                     {
 37                         for (int i = (arr.Length / twoDouble) * twoDouble; i < arr.Length; i++)
 38                         {
 39                             tempArr.Add(preArr[i]);
 40                         }
 41                     }
 42                     else {
 43                         List<int> leftArr = new List<int>();
 44                         List<int> rightArr = new List<int>();
 45                         for (int i = (arr.Length / twoDouble) * twoDouble; i < (arr.Length / twoDouble) * twoDouble+twoDouble / 2; i++)
 46                         {
 47                             leftArr.Add(preArr[i]);
 48                         }
 49                         for (int i = (arr.Length / twoDouble) * twoDouble + twoDouble / 2; i < arr.Length; i++)
 50                         {
 51                             rightArr.Add(preArr[i]);
 52                         }
 53                         subArr = MergeSortSubProgram(leftArr, rightArr);//最后一组合并
 54                         for (int i = 0; i < subArr.Count; i++)
 55                         {
 56                             tempArr.Add(subArr[i]);
 57                         }
 58                         subArr.Clear();
 59                     }
 60                 }
 61                 else if (arr.Length / twoDouble == 0) //最后一组
 62                 {
 63                     List<int> leftArr = new List<int>();
 64                     List<int> rightArr = new List<int>();
 65                     for (int i = 0; i < twoDouble / 2; i++) {
 66                         leftArr.Add(preArr[i]);
 67                     }
 68                     for (int i = twoDouble / 2; i < arr.Length; i++) {
 69                         rightArr.Add(preArr[i]);
 70                     }
 71                     subArr = MergeSortSubProgram(leftArr, rightArr);//最后一组合并
 72                     for (int i = 0; i < subArr.Count; i++) {
 73                         tempArr.Add(subArr[i]);
 74                     }
 75                     subArr.Clear();
 76                 }
 77                 
 78                 //preArr = tempArr;//使preArr指向tempArr了
 79                 twoDouble *= 2;
 80                 preArr.Clear();
 81                 for (int x = 0; x < tempArr.Count; x++) {
 82                     Console.Write(tempArr[x] + "  ");
 83                     preArr.Add(tempArr[x]);
 84                 }
 85                 Console.WriteLine();
 86             }
 87             return tempArr;
 88         }
 89         //实现左右2边数组从小到大合并
 90         List<int> MergeSortSubProgram(List<int> leftArr,List<int> rightArr)
 91         {
 92             List<int> tempArr = new List<int>();
 93             bool flag = true;
 94             int leftPos = 0, rightPos = 0;
 95 
 96             while (flag) {
 97                 if (leftArr[leftPos] < rightArr[rightPos]) //当左边的数比右边小
 98                 {
 99                     tempArr.Add(leftArr[leftPos]);
100                     leftPos++;
101                 }
102                 else {
103                     tempArr.Add(rightArr[rightPos]);
104                     rightPos++;
105                 }
106                 //当其中一组到底之后
107                 if (leftPos == leftArr.Count || rightPos == rightArr.Count) {
108                     flag = false;
109                     if (leftPos == leftArr.Count) {
110                         for (int i = rightPos; i < rightArr.Count; i++) {
111                             tempArr.Add(rightArr[i]);
112                         }
113                     }
114                     else if (rightPos == rightArr.Count) {
115                         for (int i = leftPos; i < leftArr.Count; i++) {
116                             tempArr.Add(leftArr[i]);
117                         }
118                     }
119                 }
120             }
121 
122             return tempArr;
123         }

posted @ 2017-09-07 11:51  喵爷66123  阅读(136)  评论(0编辑  收藏  举报