【C语言零基础入门篇 - 17】:排序算法
文章目录
- 排序算法
- 排序的基本概念
- 冒泡排序
- 选择排序
- 插入排序
排序算法
排序的基本概念
1、什么是排序?
排序是指把一组数据以某种关系(递增或递减)按顺序排列起来的一种算法。
例如:数列 8、3、5、6、2、9、1、0、4、7
递增排序(升序)后 0、1、2、3、4、5、6、7、8、9
递减排序(降序)后 9、8、7、6、5、4、3、2、1、0
2、排序的稳定性
如果在一组需要排序的数据序列中,数据ki和kj的值相同,即ki= =kj,且在排序前ki在序列中的位置领先于kj,那么当排序后,如果ki和kj的相对前后次序保持不变,即ki仍然领先于kj,则称此类排序算法是稳定的。如果ki和kj的相对前后次序变了,即kj领先于ki了,则称此类排序算法是不稳定的。
3、排序的过程
排序的过程中需要进行如下两种基本操作:
(1)比较两个数据的大小;
(2)移动两个数据的位置。
冒泡排序
冒泡排序(从小到大):
原始数据:8、6、5、4、9、7、1、2、3
冒泡一趟:6、5、4、8、7、1、2、3、9
特点:最大的数据会排在最后。
void BubbleSort(int arr[], int n)//n表示元素个数 从小到大排序
{
//冒泡趟数 n-1趟
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j <= n - 1 - i; j++) //把最大的元素排序在最后
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j + 1];//temp临时保存数据容器
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
选择排序
一个序列进行选择排序,首先通过一轮循环比较,从n个数据中找出最大或者最小的那个数据的位置,然后按照递增或者递减的顺序,将此数据与第一个或最后一个数据进行交换。然后再找第二大或者第二小的数据进行交换,以此类推,直到序列全部有序为止。
选择排序与冒泡排序的区别在于,冒泡排序每比较一次后,满足条件的数据就交换,而选择排序是每次比较后,记录满足条件数据的位置,一轮循环过后再作交换。
//选择排序
void SelectSort(int arr[], int n)
{
//n-1趟
int min = 0;
for (int i = 0; i < n-1; i++)//i表示当前最小元素的要在的下标值
{
min = i; //保存下标值
for (int j = i + 1; j <= n; j++)//找到当前元素里的最小值
{
if (arr[min] > arr[j])
{
min = j;
}
}
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
插入排序
插入排序的规则是:第一轮开始时默认序列中第一个数据是有序的,之后各个数据以此为基准,判断是插入在此数据的前面还是后面,之后的数据依次向后移动,腾出位置,让数据插入,以此类推,直到整个序列有序为止。每比较一次,如果满足条件(升序:前面一个数比后面需要插入的数大),就直接交换。
特点:对基本有序的序列插入排序速度相对而言比较快,插入排序的优势越明显,数据量越多,劣势也越明显。
//插入排序
void InsertSort(int arr[], int n)
{
int j = 0, i = 0;
for (j = 1; j <= n; j++)
{
i = j - 1;
int temp = arr[j];
//如果有序部分的数据,比temp大,往后移一位
while (i >= 0 && arr[i] > temp) //有序部分数据遍历从右到左
{
arr[i + 1] = arr[i];
i--;
}
arr[i + 1] = temp;
}
}