数据结构绝对是重中之重!
排序算法主要有9种
冒泡排序 交换排序 选择排序 插入排序 快速排序 归并排序 堆排序 基排序 希尔排序
每个排序都有自己的适宜场合,有不同的时间复杂度和空间复杂度。
时间复杂度主要是从比较次数和移动次数来看
接下来一一介绍
一、冒泡排序
算法思想:
1.待排序的数据看作气泡,通过n-1趟比较,从而使较小的数据浮在上层(前),较大的数据沉在下层(后)。
2.每一趟比较,从下层开始比较两个相邻的数据,如果上层的数据大于下层的数据,则交换;否则,不移动顺序继续往上比较。
void BubbleSort(int n,List &A){
for (int i=0;i<n;i++)
{
for (int j=n-1;j>=i+1;j--)
{
if (A[j].key<A[j-1].key)
{
swap(A[j],A[j-1]);
}
}
}
}
比较次数 | 移动次数 | |||
最好情况 | n-1 | 0 | ||
最坏情况 | n(n-1)/2 | 3n(n-1)/2 |
平均时间复杂度 | 最差时间复杂度 | 空间复杂度 |
O(N*N) | O(N*N) | O(1) |
二、快速排序
算法思想:(分治算法)
1.找基准元素。FindPivot(int i,int j)
作用是,使数列左侧都比基准元素要小,右侧都比基准元素要大。
如何选取?从左侧开始查找两个不同数值中的较大值作为基准元素。如果找不到两个不相同的元素,则返回0。排序结束。例如 3 3 2 5 6 1 0 则选取3为基准元素。
2.划分
(1)l表示从左边开始遍历的下标,r表示从右边开始遍历的下标。l为指向数列中从左边开始第一个比基准元素大的值;r为数列中从右边开始第一个比基准元素小的值。
(2)如果l<r,则swap(A[l],A[r]);重复(1)
如果l>r,也即l=r+1。数列从l-1和l之间划分成两部分。