【 选择排序 & 冒泡排序 & 插入排序 & 对数器验证 &随机数的运用】
文章目录
前言
介绍选择排序、冒泡排序 、插入排序 、对数器验证(涉及随机数的产生、随机数组的产生、数组的拷贝)
函数顺序:[代码实现见示例]
1. 数值交换函数
void Swap(int* arr, int i, int j)
2.选择排序算法
void selectionSort(int* arr, int num)
3.冒泡排序算法
void BubbleSort(int* arr, int num)
4.插入排序算法
void InsertSort(int* arr, int num)
5 产生随机数组函数(数组内的值为随机值)
int* randomArray(int n, int V)
6. 数组的拷贝(malloc 申请新空间进行拷贝)
int* copyArray(int n, int* arr)
7.比较数组数值是否相同函数(对数器验证思想)
bool sameArray(int* arr, int* brr, int n)
8. 打印数组值函数
void PrintArr(int* arr, int num)
9. main函数
涉及对数器验证思路,也有简单验证思路[已被注释]
//选择 冒泡 插入排序
//对数器验证 &随机数的运用【重点】
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//数组下标i,j所在的两个数据交换
void Swap(int* arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//选择排序排序
void selectionSort(int* arr, int num)
{
if (arr == NULL || num < 2)
return;
for (int minIndex, i = 0; i < num - 1; i++)
{ //minIndex : i ~num-1范围上,最小值所在位置
//初始默认i位置为最小值
minIndex = i;
//经过遍历 得到i+1~num内最小值与i位置比较(进行最小值选择),判断是否需要交换
for (int j = i + 1; j < num; j++)
{
if (arr[j] < arr[minIndex])
{
minIndex = j;
}
}
//判断是否交换 进行选择排序
Swap(arr, i, minIndex);
}
}
//冒泡排序算法
void BubbleSort(int* arr, int num)
{
if (arr == NULL || num < 2)
return;
for (int i = 0; i < num - 1; i++)
{
for (int j = i + 1; j < num; j++)
{
if (arr[i] > arr[j])
{
Swap(arr, i, j);
}
}
}
}
//插入排序
void InsertSort(int* arr, int num)
{
if (arr == NULL || num < 2)
return;
for (int i = 1; i < num; i++)
{//0~i-1已经有序,新来的数是[i],向左看
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--)
{
//j+1一直是当前插入数的位置
//j永远是当前数的前一个位置
Swap(arr, j, j + 1);
}
}
}
//main函数使用对数器方法验证三种排序是否正确
//得到一个随机数值 长度为n
//数组中每个数,都在1~V之间 随机得到
int* randomArray(int n, int V)
{
int* arr = (int*)malloc(sizeof(int) * n);
time_t t;
time(&t);
srand((unsigned int)t);
for (int i = 0; i < n; i++)
{
arr[i] = rand() % V + 1;
}
return arr;
}
//为了验证 另外开辟空间拷贝数组
int* copyArray(int n, int* arr)
{
int* ans = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
{
ans[i] = arr[i];
}
return ans;
}
//对数器为了验证方法是否正确,检验数组数据是否相同
bool sameArray(int* arr, int* brr, int n)
{
for(int i = 0; i < n; i++)
{
if (arr[i] != brr[i])
return false;
}
return true;
}
//打印数组数据
void PrintArr(int* arr, int num)
{
for (int i = 0; i < num; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
//随机数组最大长度
int N = 5;
//随机数组每个值 在1~V之间
int V = 10;
//testTimes :测试次数
int testTimes = 50;
printf("测试开始:");
time_t t;
time(&t);
srand((unsigned int)t);
for (int i = 0; i < testTimes; i++)
{
//随机得到一个长度,长度在[0,V]
int n = rand() % V + 1;
//得到随机数组
int* arr = randomArray(n, V);
int* b = copyArray(n, arr);
int* c = copyArray(n, arr);
int* d = copyArray(n, arr);
selectionSort(b,n);
BubbleSort(c, n);
InsertSort(d, n);
if (!sameArray(b, c, n) || !sameArray(c, d, n))
{
printf("出错了!");
/*当出现错误
打印是随机生成的出错例子
打印三个功能,各自排序成了什么样
可能要把例子带入每个方法,去debug 可验证三种排序是否正确
*/
}
}
printf("测试结束\n");
//简单验证三种排序方法是否正确:
/*
int a[5] = { 1,5,2,4,3 };
int n = sizeof(a) / sizeof(a[0]);
printf("原数组顺序:");
PrintArr(a, n);
printf("选择排序算法结果:");
selectionSort(a, n);
PrintArr(a, n);
int b[5] = { 1,5,2,4,3 };
printf("冒泡排序算法结果:");
BubbleSort(b, n);
PrintArr(b, n);
int c[5] = { 1,5,2,4,3 };
printf("插入排序算法结果:");
InsertSort(c, n);
PrintArr(c, n);
*/
}