排序分类:
各类排序算法复杂度:
一、冒泡排序
1、实现逻辑
所谓“冒泡排序”,可以从名称上理解:
以从小到大来举例,“冒泡”实际上就是指把值更大的元素放到数列的后面(如果是从大到小排列,则反之),通过交换来实现。
2、动态图演示
我们先来大致地看下面的动图,感受一下冒泡排序的运行过程:
3、代码实现
//冒泡排序
#include<iostream>
using namespace std;
void BubbleSort(int* arr, int n)
{
int i , j , temp =0;
for (i=0; i < n - 1; i++)
{
for (j=0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main()
{
int array[] = { 1, 34, 654, -1, 3242, 0, 2, 1, -1, 20 };
int num = sizeof(array) / sizeof(array[0]);
BubbleSort(array, num);
//范围for循环打印数组
for (auto e: array)
{
cout << e << " ";
}
cout << endl;
return 0;
}
二、快速排序
1.快排的实现逻辑:
- 先从数列中取出一个数作为基准数(通常取第一个数)。
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
2、动态图演示
3、代码实现
//双向快速排序
#include<iostream>
using namespace std;
void QuickSort(int* arr,int left, int right)
{
if (left > right)
{
return;
}
int i = left;
int j = right;
//最左边的为准基数
int flag = arr[left];
while (i != j)
{
//从右侧找到一个比标记小的值
while (arr[j] > flag && i < j)
{
j--;
}
//从左侧找到一个比标记大的值
while (arr[i] <= flag && i < j)
{
i++;
}
//交换找到的值,使左边小,右边大
int temp = 0;
if (i<j)
{
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}//完成while循环,此时i=j
//交换准基数和相遇值,即将中值归位
arr[left] = arr[i];
arr[i] = flag;
//将中值左,右侧的数据分别进行排序(递归)
QuickSort(arr, left, i - 1);
QuickSort(arr