前言
笔者在逛GitHub的时候,偶遇一开源项目,其程序可演示多种数组排序算法,于是便对排序算法有一些感兴趣。
GitHub地址:https://github.com/bingmann/sound-of-sorting
演示视频:https://www.bilibili.com/video/av685670/
为什么要将进行排序?
软件中对用户操作习惯的统计,网站中对各种用户数据的排行,这些数据往往是接近随机的,为了方便利用这些数据,所以我们需要将这些数据进行排序。
如何将数据进行排序?
将数组排序的方法有非常多,但大部分是大同小异,但经典的排序算法有9种,它们各有利弊,根据数组大小和数组中数据的某些性质选择适当的排序算法。至于这些排序算法的代码网上已经详尽,笔者就不在这里累赘了。
一个简单的排序算法
笔者这两天因使用了Visual Studio而接触了一点点C++,于是便使用C++根据自己的思路简单的实现了一个排序算法,此算法类似鸡尾酒排序算法,但却不是,有可能时笔者独创的算法吧。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define SIZE 500 //数组中元素的数量
void swap(int *p1, int *p2) //交换数组中的两元素
{
int temp = *p1; //创建变量储存元素p1的指针
*p1 = *p2; //将元素p1的指针改为元素p2的指针
*p2 = temp; //将元素p2的指针改为之前存储的元素p1的指针
}
int main() { //程序从这里开始运行
int array[SIZE]; //创建一个数组
printf("未排序数组:\n\n");
for (int i = 0; i < SIZE; i++) { //遍历数组中所有元素
array[i] = rand(); //数组中每个元素赋值为一个随机数
printf("%d ", array[i]); //输出还未排序的数组中所有元素
}
printf("\n\n 按下任意键开始排序");
getchar(); //等待用户响应
system("cls"); //清除所有输出结果
int l = -1, u = SIZE - 1; //定义我们需要寻找最值并排序的初始区间[0,SIZE]为全集
for (l++; l < u; u--) { //遍历已排序区间[0,l]∪[u,SIZE]的补集(即遍历未排序区间)
//当l >= u时,区间(l,u)为空集,跳出循环
int max = 0, min = 0; //创建用于存储最大值下标和最小值下标的变量
for (int i = l; i <= u; i++) { //遍历数组在未排序区间中的所有元素
min = array[min] > array[i] ? i : min; //寻找数组在未排序区间中最小值的下标
max = array[max] < array[i] ? i : max; //寻找数组在未排序区间中最大值的下标
}
swap(&array[l], &array[min]); //交换数组在未排序区间中的最小值与数组在未排序区间左端点的值
swap(&array[u], &array[max]); //交换数组在未排序区间中的最大值与数组在未排序区间右端点的值
printf("数组正在排序:\n\n");
for (int i = 0; i < SIZE; i++) {
printf("%d ", array[i]);
}
system("cls"); //清除所有输出结果
}
printf("排序后数组:\n\n");
for (int i = 0; i < SIZE; i++) { //遍历排序完后数组中所有元素
printf("%d ", array[i]); //输出排序后的数组中所有元素
}
getchar(); //等待用户响应(防止程序自动退出)
return 0;
}
程序运行效果:
此排序算法的基本思路其实就是不断缩小一个寻找最小值和最大值的区间,将最小值和最大值与此区间最右端和最左端的元素交换位置,直到这个区间为空,那么就全部排序完成了。因代码中注释已经足够详细,这里就不累赘了。
网友评论