C语言是过去几十年软件和硬件两个阵营之间,签署的最坚实的契约。硬件为C语言的语义提供了最能发挥其性能的基础构件,而软件虽然搞了很多的圆环套圆环般的层次,但最终都以C语言作为最后的沉淀收尾。----所以才会有C版的迷你程序!!!
之所以起头写这样系列的文档,主要是锻炼自己的编码能力,类似于leetcode吧。
浅话到此,C版的迷你程序、Python版的迷你程序、以及两个语言好玩的小项目,都会持续不定时的网络收集和自己把玩。充实自己的小白脑细胞。另外新进语言Rust和go也会有所涉猎。
1 冒泡的调试
冒泡排序--Bubble Sort是一种简单的排序算法。内层循环重复地访问要排序的数列,一次比较两个元素,如果他们的顺序“错误”(看23行和27行,从大到小还是从小到大)就把他们交换过来。每一次的外层循环都会找到一个最值。截图中肉眼可见的数据移动策略。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/time.h>
void ShowSortPro(int arr[], int len)
{
int i;
for (i = 0; i < len; i++)
printf("%6d ", arr[i]);
printf(" \n");
}
//
// 冒泡排序
// 输入参数:数组
// 数组的长度
//
void BubbleSort(int arr[], int len) {
int i, j, temp;
// > 小到大的排序
for (i = 0; i < len - 1; i++){ // 每一层结束找到最大值
printf("======================================================== %d\n", i);
for (j = 0; j < len - 1 - i; j++){
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
ShowSortPro(arr, len);
}
printf("======================================================== %d\n", i);
}
}
void main() {
int arr[] = { 65, 75, 59, 26, 92, 19, 8, 67 };
int len;
int i;
// sizeof是运算符,不是函数
// sizeof能求得静态分配内存的数组的长度,即占用内存的大小,以byte为单位
len = (int) sizeof(arr) / sizeof(arr[0]);
//printf("%ld \n", sizeof(arr));
//printf("%ld \n", sizeof(arr[0]));
ShowSortPro(arr, len);
printf("===========================================================START=\n");
BubbleSort(arr, len);
printf("============================================================END\n");
ShowSortPro(arr, len);
}
2 冒泡的耗时
这里只是测试编译器对代码进行自动优化编译和不优化的耗时比较,后续还会有其他排序算法的进行此类耗时比较,这个算法的耗时其实受到原始数据序列性的严重影响,所以代码把随机数的种子取消了,编译优化不优化处理同样的数据。感兴趣的可以试试其他级别的优化,这里要注意优化后程序的结果要正确耗时比较才有意义。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/time.h>
void ShowSortPro(int arr[], int len)
{
int i;
for (i=0; i<len; i++)
printf("%6d ", arr[i]);
printf(" \n");
}
//
// 冒泡排序
// 输入参数:数组
// 数组的长度
//
void BubbleSort(int arr[], int len) {
int i, j, temp;
// > 小到大的排序
for (i=0; i<len-1; i++){ // 每一层结束找到最大值
//printf("======================================================== %d\n", i);
for (j=0; j<len-1-i; j++){
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
//ShowSortPro(arr, len);
}
//printf("======================================================== %d\n", i);
}
}
#define N 16*1024
int arrtime[N];
int arrtimecopy[N];
void main() {
int len=15;
int i;
//srand((unsigned)time(NULL));
for (i = 0; i < N; i++)
arrtime[i] = rand()%32768;
for (i = 0; i < N; i++)
arrtimecopy[i] = arrtime[i];
struct timeval start_time, end_time;
unsigned int spend_us = 0;
ShowSortPro(arrtime, len);
printf("============================================================START\n");
gettimeofday(&start_time, NULL);
BubbleSort(arrtime, N);
gettimeofday(&end_time, NULL);
spend_us += end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec);
printf("============================================================END\n");
ShowSortPro(arrtime, len);
printf("1 \t spend %ld us \n", (end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec)));
for (i=0; i<N; i++)
arrtime[i] = arrtimecopy[i];
ShowSortPro(arrtime, len);
printf("============================================================START\n");
gettimeofday(&start_time, NULL);
BubbleSort(arrtime, N);
gettimeofday(&end_time, NULL);
spend_us += end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec);
printf("============================================================END\n");
ShowSortPro(arrtime, len);
printf("2 \t spend %ld us \n", (end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec)));
for (i=0; i<N; i++)
arrtime[i] = arrtimecopy[i];
ShowSortPro(arrtime, len);
printf("============================================================START\n");
gettimeofday(&start_time, NULL);
BubbleSort(arrtime, N);
gettimeofday(&end_time, NULL);
spend_us += end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec);
printf("============================================================END\n");
ShowSortPro(arrtime, len);
printf("3 \t spend %ld us \n", (end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec)));
for (i=0; i<N; i++)
arrtime[i] = arrtimecopy[i];
ShowSortPro(arrtime, len);
printf("============================================================START\n");
gettimeofday(&start_time, NULL);
BubbleSort(arrtime, N);
gettimeofday(&end_time, NULL);
spend_us += end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec);
printf("============================================================END\n");
ShowSortPro(arrtime, len);
printf("4 \t spend %ld us \n", (end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec)));
for (i=0; i<N; i++)
arrtime[i] = arrtimecopy[i];
ShowSortPro(arrtime, len);
printf("============================================================START\n");
gettimeofday(&start_time, NULL);
BubbleSort(arrtime, N);
gettimeofday(&end_time, NULL);
spend_us += end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec);
printf("============================================================END\n");
ShowSortPro(arrtime, len);
printf("5 \t spend %ld us \n", (end_time.tv_usec-start_time.tv_usec+1000000*(end_time.tv_sec-start_time.tv_sec)));
printf("T \t spend %f us \n", spend_us/5.0);
}