前言
本人小白,如果有错误请大佬指明 ☆*: .。. o(≧▽≦)o .。.:*☆
多谢江南先生的指导
一.计数排序
它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法。
此处引用网上一张比较经典的图片来展示整个过程:
//计数排序
#include<stdio.h>
int main()
{
int arr[7] = { 1,3,5,6,4,95,51 };
//临时数组的大小>=待排序数组最大值+1
//临时数组初始化各元素要为0
int newarr[52] = { 0 };
int i = 0;
//计算待排序数组的长度
int a = sizeof(arr) / sizeof(arr[0]);
//计算临时用于排序数组的长度
int b = sizeof(newarr) / sizeof(newarr[0]);
//临时数组数组中名序与待排序数组元素大小对应的元素个数加1
for (int j = 0;j < a;j++)
{
i = arr[j];
newarr[i]++;
}
//临时数组各元素大小为几,就将临时数组名序打印几次
for (int n = 0;n < b;n++)
{
for (int m = 0;m < newarr[n];m++)
{
printf("%5d", n);
}
}
return 0;
}
同样缺点也很明显,每次排序都需要更改临时数组的大小,当然也可以将临时数组大小设置的非常大,例如设为101,就可以排序100以内的数字
二.插入排序
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
此处引用网上一张比较经典的gif来展示整个过程:
int main()
{
int arr[5] = { 1,3,0,9,8 };
//计算待排序数组的长度
int len = sizeof(arr) / sizeof(arr[0]);
//从第一个元素开始排序
for (int i = 1;i < len;i++)
{
//将该元素与前面的各元素相比
for (int j = i;j > 0;j--)
{
if (arr[j - 1] > arr[j])
{
int tem = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tem;
}
//前面的各元素都是排序好的,不符合条件就可以直接跳出
else break;
}
}
for (int n = 0;n < len;n++)
printf("%5d", arr[n]);
return 0;
}
三.希尔排序
它与插入排序的不同之处在于,它会优先比较距离较远的元素。
此处引用网上一张比较经典的gif来展示选择排序的整个过程:
int main()
{
int nums[5] = { 1, 8 ,7 ,9 ,4};
// 1.计算待排序数组长度
int len = sizeof(nums) / sizeof(nums[0]);
// 2.计算半长
int gap = len / 2;
do {
// 3.从第一个元素开始依次取出所有用于比较元素
for (int i = gap; i < len; i++)
{
// 4.遍历取出前面元素进行比较
int j = i;
while ((j - gap) >= 0)
{
// 5.如果前面一个元素大于当前元素,就交换位置
if (nums[j - gap] > nums[j])
{
nums[j] =nums[j] ^ nums[j-gap];
nums[j-gap] = nums[j] ^ nums[j-gap];
nums[j] = nums[j] ^ nums[j-gap];
}
else break;
j--;
}
}
// 每个小数组排序完成, 重新计算半长
gap /=2;
} while (gap >= 1);
for (int n = 0;n < len;n++)
printf("%-5d", nums[n]);
return 0;
}
四.选择排序
选择排序是一种简单直观的排序算法
此处引用网上一张比较经典的gif来展示整个过程:
// 选择排序
int main()
{
int arr[5] = { 9,23,1,56,6 };
//计算待排序数组的长度
int len = sizeof(arr) / sizeof(arr[0]);
//从第一个元素开始排序
int a, b;
//临时变量
for (int i = 0;i < len;i++)
{
//将该元素与前面的元素比较排序
int j = i;
int tem = arr[i];
for(j=i;j<len;j++)
{
if (tem >= arr[j])
{
tem = arr[j];
a = j;
}
}
b = arr[i];
arr[i] = arr[a];
arr[a] = b;
}
for (int n = 0;n < len;n++)
printf("%-5d", arr[n]);
return 0;
}
它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置知道未排序元素个数为0。
五.冒泡排序
冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。
此处引用网上一张比较经典的gif来展示整个过程:
int main()
{
int arr[5] = { 9,23,4,56,6 };
//计算待排序数组的长度
int len = sizeof(arr) / sizeof(arr[0]);
//从第一个元素开始排序
for (int i = 0;i < len-1;i++)
//多次冒泡
for (int j = 0;j < len-1-i;j++)
//将该元素与前面的元素比较排序
if (arr[j] > arr[j + 1])
{
arr[j] = arr[j] ^ arr[j + 1];
arr[j + 1] = arr[j] ^ arr[j + 1];
arr[j] = arr[j] ^ arr[j + 1];
}
for (int n = 0;n < len;n++)
printf("%-5d", arr[n]);
return 0;
}