C# 用 List 实现排序

℡╲_俬逩灬. 提交于 2020-03-03 17:29:44

参考自《大话数据结构》

这是给我自己看的,看不懂可以问我hhhh
首先公用方法如下:

  • 交换两个数的方法Swap():
static void Swap(List<int> L, int i, int j)
        {
            int temp = L[i];
            L[i] = L[j];
            L[j] = temp;
        }
  • 打乱List内容的方法:
static void randsort(List<int> A)
        {
            Random random = new Random();
            int index = 0;
            int temp = 0;
            for (int i = 0; i < A.Count; i++)
            {
                index = random.Next(0, A.Count - 1);
                if (index != i)
                {
                    temp = A[i];
                    A[i] = A[index];
                    A[index] = temp;
                }
            }
        }
  • 测试代码:
static void Main(string[] args)
        {
            int nums = 10;//list的长度
            #region
            List<int> list = new List<int>();
            for (int i = 0; i < nums; i++)
            {
                list.Add(i);
            }
            Console.WriteLine("打乱之前: ");

            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine("List[" + i + "] is " + list[i]);
            }
            Console.WriteLine("----------------");
            randsort(list);
            Console.WriteLine("打乱顺序之后:");
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine("List[" + i + "] is " + list[i]);
            }
            Console.WriteLine("----------------");
            #endregion  

            //BubbleSort(list);
            //SelectSort(list);
            //InsertSort(list);
            //ShellSort(list);
            //HeadSort(list);

            #region//输出
            Console.WriteLine("排序之后: ");
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine("List[" + i + "] is " + list[i]);
            }
            #endregion
        }
  • 展示代码输出结果如下,后面我截图就省略打乱之后的效果了
    List打乱顺序效果

1. 冒泡排序:

  • 逻辑:设置两个索引 iji 从前面第一个位置开始遍历,每一次遍历都会 让 j从后往前遍历(j从倒数第二个开始遍历,依次比较 jj+1),设置一个flag作为标志,如果某一次 i 遍历之后并没有进行 j 循环里面的,那么顺序已经排好序了。

  • 代码如下:

static void BubbleSort(List<int> L)
        {
            int i, j;
            bool flag = true;
            Console.WriteLine("enter");
            for (i = 0; i < L.Count && flag; i++)
            {
                flag = false;
                for (j = L.Count - 2; j >= i; j--)
                {
                    if (L[j] > L[j + 1])
                    {
                        Swap(L, j, j + 1);
                        flag = true;
                    }
                }
            }
        }

测试结果:
冒泡排序


2. 简单选择排序:

  • 逻辑:不说了打字好累

  • 代码如下:

static void SelectSort(List<int> L)
        {
            int i, j, min;
            for (i = 0; i < L.Count - 1; i++)
            {
                min = i;
                for (j = i + 1; j < L.Count; j++)
                {
                    if (L[j] < L[min])
                    {
                        min = j;
                    }
                }
                if (min != i)
                {
                    Swap(L, min, i);
                }
            }
        }

测试结果:
简单选择排序


3. 直接插入排序

  • 逻辑:省略,注意下面的注释,我一直以为for里面的第二个判断是跟逻辑无关的,直到我那天整这个整了3个小时…
  • 代码如下:
static void InsertSort(List<int> L)
        {
            int i, j;
            for (i = 1; i < L.Count; i++)
            {
                //int temp;
                if (L[i] < L[i - 1])
                {
                    int temp = L[i];
                    //跟顺序有关系j >= 0 和 L[j] > temp换过来会报错:超出索引
                    for (j = i - 1; j >= 0 && L[j] > temp; j--)
                    {
                        L[j + 1] = L[j];
                    }
                    L[j + 1] = temp;
                }
            }
        }
  • 效果截图:
    插入排序

4. 希尔shell排序

  • 逻辑:省略

  • 代码如下:

static void ShellSort(List<int> L)
        {
            int i, j, temp;
            int increment = L.Count;
            do
            {
                increment = increment/3+1;
//书上是i=increment+1,如果加1的话那么是L[1]跟L[1+increment]替换,L[0]没有进行替换
                for (i = increment ; i < L.Count; i++) 
                {
                    if (L[i] < L[i - increment])
                    {
                        temp = L[i];
                        for (j = i - increment; j >= 0 && L[j] > temp; j-=increment)
                        {
                            L[j + increment] = L[j];
                        }
                        L[j + increment] = temp;
                    }
                }
            } while (increment > 1);
        }
  • 效果截图:
    希尔排序

后面的写完了再整

5. 排序

  • 逻辑:省略

  • 代码如下:

  • 效果截图:


6. 排序

  • 逻辑:省略

  • 代码如下:

  • 效果截图:


7. 排序

  • 逻辑:省略

  • 代码如下:

  • 效果截图:


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!