前言
上了大学后,发现排序算法随处可见,只要是考C语言的,总会让你写几个排序算法。为了加深我的记忆以及对排序算法的理解,我整理了4种最容易理解的排序算法一、排序算法是什么?
个人理解:排序算法就是为任意长度的数组由小到大排序(或者由大到小)的一种方法。二、四大排序算法
交换函数
在写排序算法之前,首先先定义一个swap交换函数。
代码如下
/* 定义交换函数 */
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
1.冒泡排序
冒泡排序无疑是最简单的排序算法,通过多次的交换达到排序的目的 图解如下: 代码如下:/* 冒泡排序 */
void BubbleSort(int* arr, int size)
{
for (int i = size - 1; i > 0; i--) /* 进行size-1个循环 */
for (int j = 0; j < i; j++) /* 每次需要交换i-1次 */
if (arr[j] > arr[j + 1])
swap(&arr[j], &arr[j + 1]); /* 将值大的元素通过交换持续后移 */
}
2.选择排序
选择排序就在整个数组元素中找到最小值然后替换到前面的方法 图解如下:代码如下:
/* 选择排序 */
void SelectionSort(int* arr, int size)
{
int small, flag;
for (int i = 0; i < size - 1; i++)
{
small = i;
flag = i; /* flag作为标志一直后移,将值小元素互换到前面*/
for (int j = i + 1; j < size; j++)
if (arr[small] > arr[j]) small = j; /* 搜寻值小元素的下标 */
swap(&arr[small], &arr[flag]); /* 将值小元素与flag元素互换 */
}
}
3.插入排序
话不多说图解 代码如下:/* 插入排序 */
void InsertionSort(int* arr, int size)
{
int flag;
for (int i = 1; i < size; i++)
{
int j = i - 1;
flag = arr[i]; /* flag为插入元素 */
while (j >= 0 && flag < arr[j]) /* 搜寻flag插入位置 */
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = flag; /* 将flag插入到合适位置 */
}
}
4.快速排序
快速排序个人认为是这四大排序中最难的一种,但是从名字就可以知道它是最快的一种,它用到了递归算法,将数组通过几次分段,得到最后的正序数组 下来看图解吧!/* 快速排序 */
void QuickSort(int* arr, int began, int end)
{
if (began < end) /* 递归结束的标志 */
{
int flag = arr[began]; /* 以第一个元素为flag */
int i = began;
int j = end;
while (i < j)
{
while (i < j && flag < arr[j])
j--; /* 尾部开始搜寻小于flag的元素 */
arr[i] = arr[j];
while (i<j && flag>arr[i])
i++; /* 头部开始搜寻大于flag的元素 */
arr[j] = arr[i];
}
arr[i] = flag; /* 将flag位置固定 */
QuickSort(arr, began, i - 1);
QuickSort(arr, i + 1, end); /* 将数组分为两段,同理递归 */
}
}