十大排序算法
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:
1.冒泡排序
算法思想
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。
算法步骤
1.比较相邻的元素。如果第一个元素比第二个元素大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
动图演示
代码实现
// 冒泡排序
void bubbleSort(vector<int>&nums)
{
int len = nums.size();
for (int i = 0; i < len-1; i++)
{
for (int j = 0; j < len - 1-i; j++)
{
if (nums[j] > nums[j + 1])
{
swap(nums[j], nums[j + 1]);
}
}
}
}
2.快速排序(面试常考)
算法思想
快速排序使用分治的思想,选择一个基准,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行递归排序,以达到整个序列有序的目的。快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。
- 先在当前区间利用partition()找到一个基点,将小于这个基点的数放在基点左侧,大于基点的数放在基点右侧
- 然后再分别对这个基点左侧区间和右侧区间进行上述处理,递归下去即可完成排序。
算法步骤
- 1.从数列中挑出一个元素,称为 “基准”(pivot);
- 2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 3.递归地(recursive)对小于基准值元素的子数列和大于基准值元素的子数列进行排序;