大家好,我是quicklysleep,欢迎大家光临我的博客,算法学习笔记系列持续更新中~
文章目录
一、前言
二、排序算法的介绍
三、排序算法的运用
这里主要介绍冒泡排序,快速排序,归并排序
.(其实博主不会别的排序算法)
推荐看一下动图演示,百度可以搜到,可以更直观理解.
重点在排序算法的思想
,常用的主要就几个.
1.快速排序模板
算法步骤
1.确定分界点
2.调整区间,使x左边的区间都小于等于x(此时区间内不一定是有序的),右边则大于
3.递归处理左右两段
如下:
void quick_sort(int q[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while (i < j)
{
do i ++ ; while (q[i] < x);
do j -- ; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
2.冒泡排序模板
算法步骤
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
如下:
void bubble_sort(T arr[], int len) {
int i, j;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
3.归并排序模板
算法步骤
1.确定分界点为首末中点
2.以中点为界,递归排序中点两侧使其有序
3.归并,合二为一
void merge_sort(int q[], int l, int r)
{
if (l >= r) return;
int mid = l + r >> 1;
merge_sort(q, l, mid);
merge_sort(q, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while (i <= mid && j <= r)
if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
else tmp[k ++ ] = q[j ++ ];
while (i <= mid) tmp[k ++ ] = q[i ++ ];
while (j <= r) tmp[k ++ ] = q[j ++ ];
for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}