龙空技术网

C版的迷你程序——冒泡的排序算法

chenleiyfk 381

前言:

今天各位老铁们对“c语言中冒泡排序的算法”大约比较关切,各位老铁们都需要分析一些“c语言中冒泡排序的算法”的相关内容。那么小编同时在网络上网罗了一些有关“c语言中冒泡排序的算法””的相关知识,希望兄弟们能喜欢,看官们一起来了解一下吧!

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*1024int 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);}

未优化

2级优化

标签: #c语言中冒泡排序的算法 #编一程序用冒泡排序方法对10个整数排序从大到小