zoukankan      html  css  js  c++  java
  • 排序

     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         }

  • 相关阅读:
    常用的长度单位
    HTML常用的列表标签
    html常用文本标签
    CSS选择器及优先级
    块级元素与内联元素
    移动端app打包
    内联框架
    Leetcode303.区域和检索-数组不可变
    Leetcode107.二叉树的层次遍历||
    Leetcode784.字母大小写全排列
  • 原文地址:https://www.cnblogs.com/cat66/p/7488973.html
Copyright © 2011-2022 走看看