数据结构:第八章学习小结

一、本章小结

 

1.根据时间复杂度的不同,常见的算法可以分为3大类。

    1).O(n²) 的排序算法

  • 冒泡排序

  • 简单选择排序

  • 插入排序:直接插入,折半插入

    2).O(n log n) 的排序算法

  • 希尔排序
  • 归并排序

快速排序

  • 堆排序

2.根据是否受到待排序对象初始排列影响,可分为

 1)受到待排序对象的初始排列:

  • 直接插入
  • 折半插入(虽然比较次数不受初始排列影响:在插入第i个记录时,经过(log2i)+1次比较;但移动次数与直接插入相同,受初始排列影响)
  • 快速排序(有可能退化到简单排序,所以平均情况下,时间复杂度为O(nlogn))
  • 冒泡排序
  • 简单选择排序

 2)没有受到待排序对象的初始排列影响:

  • 堆排序
  • 归并排序

 3.排序的具体操作

1)冒泡排序(Bubble Sort) 是一种基础的 交换排序

冒泡排序之所以叫冒泡排序,是因为它每一种元素都像小气泡一样根据自身大小一点一点往数组的一侧移动。

算法步骤如下:

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

  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数;

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

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

2)选择排序(Selection Sort)

选择排序(Selection sort) 是一种简单直观的排序算法。

选择排序的主要优点与数据移动有关。

如果某个元素位于正确的最终位置上,则它不会被移动。

选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对 n 个元素的表进行排序总共进行至多 n - 1 次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

选择排序的算法步骤如下:

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;

  2. 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;

  3. 以此类推,直到所有元素均排序完毕。

3)插入排序(Insertion Sort)

插入排序(Insertion sort) 是一种简单直观的排序算法。

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序的算法步骤如下:

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

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

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

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

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

  6. 重复步骤2~5。

4)快速排序(Quick Sort)

快速排序(Quicksort),又称 划分交换排序(partition-exchange sort) 。

快速排序(Quicksort) 在平均状况下,排序 n 个项目要 O(n log n) 次比较。在最坏状况下则需要 O(n2) 次比较,但这种状况并不常见。事实上,快速排序 O(n log n) 通常明显比其他算法更快,因为它的 内部循环(inner loop) 可以在大部分的架构上很有效率地达成。

快速排序使用 分治法(Divide and conquer) 策略来把一个序列分为较小和较大的2个子序列,然后递归地排序两个子序列。

快速排序的算法步骤如下:

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

  2. 分割:重新排序序列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;

  3. 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

二、实践作业心得

在完成第八章作业时,运用了一种新的排序算法:“投票算法”。

step1:把输入的年龄当作数组下标

int x;
    int a[10000];
    cin>>x;//总数
    for(int i=0;i<x;i++)
    {
        int m;
        cin>>m;
        a[m]++;
     } 

 

step2:数组中每个元素的值就是对应的年龄人数,即若a[44]=2,表示44岁的有两人

for(int i=0;i<51;i++)
     {
         if(a[i]!=0)
         cout<<i<<":"<<a[i]<<endl;
         
     }

 

posted @ 2020-07-12 12:38  甘番雨  阅读(149)  评论(0编辑  收藏  举报