您现在的位置是:首页 >学无止境 >十大排序算法网站首页学无止境
十大排序算法
简介十大排序算法
1.冒泡排序
步骤:从头元素开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置,执行完一轮,最末尾的那个元素就是最大的元素
1.1冒泡算法
void BubbleSort(int arr[], size_t length)
{
for (int end = length-1; end > 0; --end)//
{
for (int begin = 0; begin < end; ++begin)
{
if (arr[begin] > arr[begin +1])
{
int tmp = arr[begin];
arr[begin] = arr[begin + 1];
arr[begin + 1] = tmp;
}
}
}
}
1.2优化1:如果已经完全有序,可以提前结束比较
void BubbleSort(int arr[], size_t length)
{
for (int end = length - 1; end > 0; --end)//
{
bool bSorted = true;
for (int begin = 0; begin < end; ++begin)
{
if (arr[begin] > arr[begin + 1])
{
int tmp = arr[begin];
arr[begin] = arr[begin + 1];
arr[begin + 1] = tmp;
bSorted = false;
}
}
if (bSorted == true) break;//已经完全有序
}
}
1.3 优化2:如果序列尾部已经局部有序,可以记录最后一次交换的位置,减少比较次数
//冒泡排序的优化 如果序列尾部已经局部有序,可以记录最后一次交换的位置,减少比较次数
void BubbleSort(int arr[], size_t length)
{
for (int end = length - 1; end > 0; --end)//
{
//为数组完全有序做准备的,只进行一次外循环就退出
int iLastSortIndex = 1;
for (int begin = 0; begin < end; ++begin)
{
if (arr[begin] > arr[begin + 1])
{
int tmp = arr[begin];
arr[begin] = arr[begin + 1];
arr[begin + 1] = tmp;
iLastSortIndex = begin;//记录一下最后一次比较的位置
}
}
end = iLastSortIndex;
}
}
最坏,平均时间复杂度:O(n^2)
最好时间复杂度:O(n)经过一轮循环,如果是完全有序,可以提前退出。
算法稳定性
如果两个相等的元素,在排序前后的相对位置保持不变,就是稳定。
冒牌算法是稳定的排序算法,注意不要将 > 写成 >=
2.选择排序
执行流程:. 从序列中找到最大的那个元素,然后与最末尾的元素交换位置,最末尾的元素就是最大的元素
void selectSort(int arr[], size_t length)
{
for (int end = length - 1; end > 0; --end)//
{
int maxIndex = 0;
for (int begin = 0; begin < end; ++begin)
{
if (arr[maxIndex] < arr[begin])
maxIndex = begin;
}
//跟结尾进行交换
int temp = arr[maxIndex];
arr[maxIndex] = arr[end];
arr[end] = temp;
}
}
最好,最坏,平均时间复杂度是O(n^2)
3.堆排序
对选择排序的一种优化
执行流程
- 对序列进行原地建堆 O(n)
- 重复执行以下操作,直到堆的元素数量为1 执行n-1
1. 交换堆顶元素与尾元素
2. 堆的元素数量减1
3. 对0位置进行1次下滤操作 O(logn)
堆排序的时间复杂度O(n(logn))
4.快速排序
执行流程:
1.从序列中选择一个轴点(pivot)元素
假设每次选择0位置的元素为轴点元素
2.利用pivot元素将序列分割成2个子序列
- 将小于pivot的元素放在pivot前面
- 将大于pivot的元素放在pivot后面
- 等于pivot的元素放在哪边都可以
3.对子序列进行1,2操作
直到不能分割(子序列只剩下1个元素)
快速排序的本质:逐渐将每个元素都转换成轴点元素
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。