【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;}
}