数据结构与STL_第8章_排序
- 格式:ppt
- 大小:1.46 MB
- 文档页数:118
数据结构-排序数据结构-排序1.介绍排序是计算机科学中常见的问题之一,它涉及将一组元素按照预定的顺序重新排列的操作。
排序算法是解决排序问题的工具,不同的排序算法具有不同的时间复杂度和空间复杂度,因此在选择排序算法时需要仔细考虑。
2.冒泡排序冒泡排序是一种简单直观的排序算法,它的基本思想是通过相邻元素的比较和交换来进行排序。
具体步骤如下:- 从第一个元素开始,比较相邻的两个元素,如果前面的元素大于后面的元素,则交换它们的位置。
- 重复上述步骤,直到没有需要交换的元素,或者已经遍历完所有元素。
3.插入排序插入排序是一种稳定的排序算法,它的基本思想是将待排序的元素插入到已排序序列中的适当位置。
具体步骤如下:- 将序列的第一个元素视为已排序序列。
- 依次将后续元素插入到已排序序列中的适当位置,使得插入后的序列仍然有序。
4.选择排序选择排序是一种简单直观的排序算法,它的基本思想是每次从未排序的部分中选择最小的元素,并将其放到已排序部分的末尾。
具体步骤如下:- 在未排序序列中找到最小的元素,将其与未排序序列的第一个元素交换位置。
- 重复上述步骤,直到所有元素都排序完毕。
5.快速排序快速排序是一种高效的排序算法,它的基本思想是通过划分将待排序的序列分成两个子序列,分别对这两个子序列进行排序。
具体步骤如下:- 选择一个枢轴元素,将序列分成左右两个子序列,使得左子序列的元素都小于等于枢轴元素,右子序列的元素都大于等于枢轴元素。
- 对左右子序列分别进行递归调用快速排序。
6.归并排序归并排序是一种稳定的排序算法,它的基本思想是将待排序的序列递归地分成两个子序列,对这两个子序列分别进行排序,然后将排好序的子序列合并成一个有序序列。
具体步骤如下:- 将序列平均分成两个子序列,分别对这两个子序列进行递归调用归并排序。
- 将两个排好序的子序列合并成一个有序序列。
7.堆排序堆排序是一种高效的排序算法,它的基本思想是将待排序的元素构建成一个大根堆或小根堆,然后重复从堆顶取出最大(最小)元素,将其与未排序部分的最后一个元素交换位置,再调整堆,直到所有元素都排序完毕。
数据结构——排序在计算机科学中,数据结构是组织和存储数据的方式,而排序则是对数据进行有序排列的操作。
排序在很多应用中都起着至关重要的作用,比如从大量数据中快速查找特定元素、生成有序的报告或者优化算法的性能等。
想象一下,你有一堆杂乱无章的数字,就像一堆随意摆放的玩具。
现在你需要把它们按照从小到大或者从大到小的顺序排列好,这就是排序要做的事情。
常见的排序算法有很多,比如冒泡排序、插入排序、选择排序、快速排序、归并排序等等。
接下来,咱们一个一个来看看。
先说说冒泡排序。
它就像是水里的泡泡,轻的往上跑,重的往下沉。
每次比较相邻的两个元素,如果顺序不对就交换它们。
这样一轮一轮地比较和交换,直到整个序列都有序。
比如说,有一组数字 5,3,8,2,1 。
第一轮比较,先比较 5 和 3 ,因为 5 大于 3 ,所以交换位置,变成 3,5,8,2,1 。
接着比较 5 和8 ,顺序对的,不交换。
再比较 8 和 2 ,交换,变成 3,5,2,8,1 。
然后比较 8 和 1 ,交换,变成 3,5,2,1,8 。
这一轮结束,最大的 8 就“浮”到了最后。
然后再从头开始第二轮比较,直到所有数字都排好序。
插入排序呢,就像是打牌时整理手牌。
每次从待排序的元素中取出一个,插入到已排序的部分中的合适位置。
还是用上面的例子 5,3,8,2,1 。
一开始,5 是已排序部分,然后 3 要插入,因为 3 小于 5 ,所以把 5 往后移一位,把 3 放在 5 前面,已排序部分就变成 3,5 。
接着 8 插入,因为 8 大于 5 ,直接放在后面,已排序部分变成 3,5,8 。
2 插入,依次和 8,5,3 比较,最后放在 3 前面,已排序部分变成 2,3,5,8 。
最后 1 插入,经过比较移动,最终排序为 1,2,3,5,8 。
选择排序则是每次从待排序的元素中选择最小(或最大)的元素,放到已排序序列的末尾。
对于 5,3,8,2,1 这组数字。
第一轮,从 5,3,8,2,1 中选择最小的 1 ,与第一个 5 交换位置,变成 1,3,8,2,5 。
数据结构--排序算法总结概述排序的分类:内部排序和外部排序内部排序:数据记录在内存中进行排序外部排序:因排序的数据量大,需要内存和外存结合使用进行排序这里总结的八大排序是属于内部排序:当n比较大的时候,应采用时间复杂度为(nlog2n)的排序算法:快速排序、堆排序或归并排序。
其中,快速排序是目前基于比较的内部排序中被认为最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
———————————————————————————————————————————————————————————————————————插入排序——直接插入排序(Straight Insertion Sort)基本思想:将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。
即:先将序列的第1个记录看成一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,用于临时存储和判断数组边界直接插入排序示例:插入排序是稳定的,因为如果一个带插入的元素和已插入元素相等,那么待插入元素将放在相等元素的后边,所以,相等元素的前后顺序没有改变。
算法实现:[cpp]view plain copy1.#include<iostream>ing namespace std;3.4.void print(int a[], int n ,int i)5.{6. cout<<i<<":";7.for(int j= 0; j<8; j++){8. cout<<a[j] <<" ";9. }10. cout<<endl;11.}12.13.void InsertSort(int a[],int n)14.{15.int i,j,tmp;16.for(i=1;i<n;++i)17. {18.// 如果第i个元素大于第i-1个元素,直接插入19.// 否则20.// 小于的话,移动有序表后插入21.if(a[i]<a[i-1])22. {23. j=i-1;24. tmp=a[i]; // 复制哨兵,即存储待排序元素25. a[i]=a[i-1]; // 先后移一个元素26.while(tmp<a[j])27. {28.// 哨兵元素比插入点元素小,后移一个元素29. a[j+1]=a[j];30. --j;31. }32. a[j+1]=tmp; // 插入到正确的位置33. }34. print(a,n,i); // 打印每一趟排序的结果35. }36.}37.38.int main()39.{40.int a[8]={3,1,5,7,3,4,8,2};41. print(a,8,0); // 打印原始序列42. InsertSort(a,8);43.return 0;44.}分析:时间复杂度:O(n^2)———————————————————————————————————————————————————————————————————————插入排序——希尔排序(Shell Sort)基本思想:先将整个待排序的记录序列分割成为若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录依次进行直接插入排序。
引言概述:数据结构是计算机科学中的重要基础知识,而排序算法则是数据结构中最基本也是最常用的算法之一。
本文将介绍数据结构中的八大排序算法,包括插入排序、选择排序、冒泡排序、快速排序、归并排序、堆排序、计数排序和桶排序。
通过深入理解这些排序算法的原理和特点,能够为我们在实际编程中选择合适的排序算法提供指导。
正文内容:一、插入排序1.直接插入排序:将待排序的元素逐个插入已排好序的序列中。
2.希尔排序:将待排序的元素按照一定间隔分组,然后在每个分组内进行插入排序操作。
二、选择排序1.简单选择排序:每次从待排序序列中选择最小的元素放到已排序序列的末尾。
2.堆排序:构建一个大顶堆,每次取堆顶元素并调整堆的结构。
三、冒泡排序1.冒泡排序:通过相邻元素的比较和交换,将最大的元素逐渐冒泡到待排序序列的末尾。
四、快速排序1.快速排序:选择一个基准元素,将序列分为两部分,小于基准元素的放在左边,大于基准元素的放在右边,然后递归地对左右子序列进行排序。
五、归并排序1.归并排序:将序列分成两部分分别进行排序,然后将两个有序的子序列合并成一个有序序列。
六、堆排序1.堆排序:通过构建一个最大堆或最小堆,将最大或最小元素依次取出并调整堆的结构,从而得到有序序列。
七、计数排序1.计数排序:统计待排序序列中各元素出现的次数,然后按照元素的大小顺序从小到大依次输出。
八、桶排序1.桶排序:将待排序的元素分到不同的桶中,每个桶中的元素可以使用其他排序算法进行排序,然后将桶中的元素按顺序依次输出。
总结:数据结构中的八大排序算法各有特点和适用场景。
插入排序适用于小规模的数据排序,选择排序适用于大规模且基本有序的数据排序,冒泡排序适用于简单排序,快速排序适用于大规模数据排序,归并排序适用于链表和外排序,堆排序适用于需要稳定排序的场景,计数排序适用于数据范围较小的场景,桶排序适用于浮点数排序。
通过熟练掌握这些排序算法的原理和实现方式,可以在实际编程中根据需求选择合适的排序算法,提升程序的效率和性能。
数据结构--排序算法总结概述排序的分类:内部排序和外部排序内部排序:数据记录在内存中进行排序外部排序:因排序的数据量大,需要内存和外存结合使用进行排序这里总结的八大排序是属于内部排序:当n比较大的时候,应采用时间复杂度为(nlog2n)的排序算法:快速排序、堆排序或归并排序。
其中,快速排序是目前基于比较的内部排序中被认为最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
———————————————————————————————————————————————————————————————————————插入排序——直接插入排序(Straight Insertion Sort)基本思想:将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。
即:先将序列的第1个记录看成一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,用于临时存储和判断数组边界直接插入排序示例:插入排序是稳定的,因为如果一个带插入的元素和已插入元素相等,那么待插入元素将放在相等元素的后边,所以,相等元素的前后顺序没有改变。
算法实现:[cpp]view plain copy1.#include<iostream>ing namespace std;3.4.void print(int a[], int n ,int i)5.{6. cout<<i<<":";7.for(int j= 0; j<8; j++){8. cout<<a[j] <<" ";9. }10. cout<<endl;11.}12.13.void InsertSort(int a[],int n)14.{15.int i,j,tmp;16.for(i=1;i<n;++i)17. {18.// 如果第i个元素大于第i-1个元素,直接插入19.// 否则20.// 小于的话,移动有序表后插入21.if(a[i]<a[i-1])22. {23. j=i-1;24. tmp=a[i]; // 复制哨兵,即存储待排序元素25. a[i]=a[i-1]; // 先后移一个元素26.while(tmp<a[j])27. {28.// 哨兵元素比插入点元素小,后移一个元素29. a[j+1]=a[j];30. --j;31. }32. a[j+1]=tmp; // 插入到正确的位置33. }34. print(a,n,i); // 打印每一趟排序的结果35. }36.}37.38.int main()39.{40.int a[8]={3,1,5,7,3,4,8,2};41. print(a,8,0); // 打印原始序列42. InsertSort(a,8);43.return 0;44.}分析:时间复杂度:O(n^2)———————————————————————————————————————————————————————————————————————插入排序——希尔排序(Shell Sort)基本思想:先将整个待排序的记录序列分割成为若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录依次进行直接插入排序。