• 面试常考各类排序算法总结.(c#)


    前言

    面试以及考试过程中必会出现一道排序算法面试题,为了加深对排序算法的理解,在此我对各种排序算法做个总结归纳。

    1、冒泡排序算法(BubbleSort)

    1.1 算法描述

    (1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

    (2)对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

    (3)针对所有的元素重复以上的步骤,除了最后一个。

    (4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

      最好时间复杂度O(n) 最坏时间复杂度O(n2)

    1.2 动图演示

    1.3 C#代码实现

    public Class SortDemo
    {
         public void BubbleSort(int arr)
         {
                int temp=0;
              //需要走arr.Length-1 趟
               for(int i=0;i<arr.Length-1;i++)
               {
                     //每一趟需要比较次数
                     for(int j=0,j<arr.Length-i-1;j++)
                     {
                         //升序排序
                          if(arr[j]>arr[j+1])
                          {
                                   temp=arr[j];//将较大的变量保存在临时变量
                                   arr[j]=arr[j+1];
                                   arr[j+1]=temp;
                           }   
                     }
                }
             
         }
    }

    2、直接插入排序(InsertionSort)

    2.1 算法描述

    (1)从第一个元素开始,该元素可以认为已经被排序;

    (2)取出下一个元素,在已经排序的元素序列中从后向前扫描;

    (3)如果该元素(已排序)大于新元素,将该元素移到下一位置;

    (4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

    (5) 将新元素插入到该位置后;

    (6)重复步骤2~5。

    2.2 动图演示

    2.3 C#代码实现

    public Class SortDemo
    {
          public void InsertionSort(int[] arr)
          {
                 int temp=0;
                 //遍历待插入的数(从第二位开始)
                 for(int i=1;i<arr.Length;i++)
                 {
                temp=arr[i];//待插入的数
                int j=i-1;//(j为已排序的待插入的位置序号)
    //若已排序的数大于待插入数,则往后移一位 while(j>=0&&arr[j]>arr[i]) { arr[j+1]=arr[j]; j--; } arr[j+1]=temp;//将待插入的数放入插入位置 } } }

    3、选择排序(SelectionSort)

    3.1 算法描述

     选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 

    (1)初始状态:无序区为R[1..n],有序区为空;

    (2)第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;

    (3)n-1趟结束,数组有序化了。

    3.2 动图演示

    3.3 C#代码实现

    public void SelectionSort(int[] arr)
         {
    int temp;
    for(int i=0;i<arr.Length-1;i++)
    {
    int minVal=arr[i];
    int minIndex=i;
    for(int j=i+1;j<arr.Length;j++)
    {
    if(minVal>arr[j])
    {
    minVal=arr[j];
    minIndex=j;
    }
    }
    temp=arr[i];
    arr[i]=minVal;
    arr[minIndex]=temp;
    } } }

     4、快速排序(QuickSort)

    4.1 算法描述

    (1)从数列中挑出一个元素,称为 “基准”(pivot);

    (2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

    (3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

    4.2 动图演示

    4.3 c#代码实现

    public Class SortDemo
    {
         public void QuickSort(int[] arr,int low,int high)
         {
               if(low<high)
               {
                     int keyIndex=low;
                     int key=arr[low];
                     int first=low;
                     int last=high;               
                     while(first<last)
                     {
                            while(last>=key&&first<last)
                                       last--;
                             Swap(arr,last,keyIndex);
                             keyIndex=last;
                             while(first<=key&&first<last)
                                      first++;
                             Swap(arr,first,keyIndex);
    keyIndex=first; } QuickSort(arr,low,keyIndex
    -1); QuickSort(arr,keyIndex+1,high); } } private void Swap(int[] arr,i,j) { int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } }
    作者:戈多编程(geduocoding)
    QQ技术交流群:654181600
    如果您希望与我交流互动,欢迎微博互粉
    如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    20201303 2019-2020-2 《Python程序设计》实验三报告
    20201303 2020-2021-2 《Python程序设计》实验二报告
    20201303张奕博 实验一 Python程序设计入门
    2020-2021-1博客汇总
    俄罗斯方块and四则运算实践
    python对于数据库的相关实践
    20201303获奖感言与学习体会
    openssl实践
    2021-2022 2113 2114信息安全导论 第五周总结
    第九章第十章
  • 原文地址:https://www.cnblogs.com/geduocoding/p/7097870.html
Copyright © 2020-2023  润新知