目录
前言
初学编程,记录一下八大经典排序算法,以便后续复习。参考借鉴了很多文章和代码,在本文末尾会进行标注,也在此对各位前辈表示感谢。
本文记录的排序算法有:冒泡排序、快速排序、选择排序、插入排序、归并排序、希尔排序、堆排序、基数排序。相关描述均以升序排序为例。
一、冒泡排序
1、算法思想:
①从第1个元素开始,与后面相邻的元素进行比较,若前者大于后者,则两者交换;
②直至比较至最后一个元素,则经过第一轮比较后,末尾元素即为最大的元素;
③重复前面的步骤,第二轮比较至倒数第二个元素,得到第二大的元素,依次类推;
④每轮比较的元素越来越少,直至没有元素需要比较,即可得到升序序列。
2、动图示意(图源公众号:程序员乔戈里 https://mp.weixin.qq.com/s/6PMTtUtYUQxXRf4zWdoZkQ)
示意图是从最后一个元素开始往前比较,依次确定前面的元素为比较序列的最小值,原理相同
3、代码实现(C语言)
#include <stdio.h>
#include <malloc.h>
void BubbleSort(int *a, int len);
int main(void)
{
int len, i;
int * a;
printf("请输入要排序的数的个数:");
scanf("%d", &len);
a = (int *) malloc (len * sizeof(int)); //动态构造数组
printf("请依次输入要进行升序排序的数:\n");
for(i = 0; i < len; ++i)
{
scanf("%d", &a[i]);
}
BubbleSort(a, len); //调用排序函数
for(i = 0; i < len; ++i)
{
printf("%d ", a[i]);
}
printf("\n"); //输出排序结果
return 0;
}
void BubbleSort(int *a, int len) //核心代码:排序函数
{
int i, j, t;
for(i = 0; i < len; ++i)
{
for(j = 0; j < len-i-1; ++j)
{
if(a[j] > a[j+1]) //两个数两个数比较,大的放后面,每一轮比较都能得到未排列数的最大值
{
t = a[j];
a[j] = a[j+1]; //借助临时变量t来进行两个数的交换,使得较大的数放在后面
a[j+1] = t;
}
}
}
}
二、快速排序
1、算法思想:
①从数列中选出一个元素(通常选第一个元素)作为基准;
②所有比该数小的元素交换至其左边,比该数大的元素放在右边,一轮比较之后即可确定该基准元素在有序序列中的位置;
③至此该基准元素将数列划分为左右两个新的数列,对左右两个新数列进行步骤①②同样的处理,进一步确定其他元素的排序位置;
④用递归的方式,最终将所有的元素的位置确定下来,形成有序序列。
2、动图示意
示意图是以最后一个元素作为基准,原理相同,代码以第一个元素为基准。
3、代码实现
#include <stdio.h>
#include <malloc.h>
void QuickSort(int *a, int low, int high);
int FindPos(int *a, int low, int high);
int main(void)
{
int len, i;
int * a;
printf("请输入要排序的数的个数:");
scanf("%d", &len);
a = (int *) malloc (len * sizeof(int)); //动态构造数组
printf("请依次输入要进行升序排序的数:\n");
for(i = 0; i < len; ++i)
{
scanf("%d", &a[i]);
}
QuickSort(a, 0, len-1); //调用排序函数
for(i = 0; i < len; ++i)
{
printf("%d ", a[i]);
}
printf("\n"); //输出排序结果
return 0;
}
void QuickSort(int *a, int low, int high) //low和high分别表示数组下标的最小值和最大值
{
int pos; //变量表示第一个元素完成排序后对应的下标
if(low < high)
{
pos = FindPos(a, low, high);
QuickSort(a, low, pos-1); //用递归处理左右两边未排序的数
QuickSort(a, pos+1, high); //pos-1和pos+1对应high和low,相等则跳出递归
}
}
int FindPos(int *a, int low, int high) //该函数旨在找到每次快排时第一个元素的位置
{
int v