学习几种排序算法

0. 记录一下 测试数据 和 swap 函数

复制代码
#include <stdio.h>
void swap(int *p_a, int *p_b) {
    *p_a = *p_a ^ *p_b;
    *p_b = *p_a ^ *p_b;
    *p_a = *p_a ^ *p_b;
}

void print_arr(int arr[], int len) {
    int ix = 0;
    for (ix = 0; ix < len; ix++)
    {
        printf("%3d ", arr[ix]);
    }
    printf("\n");
}

void main() {
    //int arr[] = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 99};
    int arr[] = {3, 2, 1, 4};
    int len = sizeof(arr) / sizeof(arr[0]);
    print_arr(arr, len);
    /*  执行对应的排序函数 */
    select_sort();
    print_arr(arr, len);
}
View Code
复制代码

1. 记录一下 冒泡排序的代码

复制代码
void bubble_sort(int arr[], int n)
{
    int ix, jx;
// n个元素,需要排序的元素个数是n-1个
for (ix = 0; ix < n - 1; ix++) {
// 每次排序,需要进行判断相邻元素的大小,最多的一次是 n-1次判断,最少的一次是1次
for (jx = 0; jx < n - 1 -ix; jx++) { if (arr[jx] < arr[jx + 1]) { swap(&arr[jx], &arr[jx + 1]); } } } }
执行结果:

$ ./a.out
len=14
22 34 3 32 82 55 89 50 37 5 64 35 9 99
99 89 82 64 55 50 37 35 34 32 22 9 5 3

复制代码

 2.  选择排序

复制代码
void select_sort(int arr[], int n)
{
    int ix, jx, key;
   // n个元素,需要对n-1个元素进行排序
    for (ix = 0; ix < n - 1; ix++)
    {
        key = ix; // 假设ix对应的元素是最小的,在内循环结束之后,ix对应的位置放 比较之后最小的数值
        for(jx=ix+1; jx < n; jx++)
        {
            if (arr[jx] < arr[key])
            {
                key = jx; // 遍历一次,记录最小的元素的下标
            }
        }

        if (key != ix)  // 需要交换,再交换
        {
            swap(&arr[key], &arr[ix]);
        }
    }
}
复制代码

 3. 插入排序,默认第0个是排好顺序的,从i=1 开始插入,

复制代码
void insert_sort(int *p, int n) {
    int ix, jx, key;
    for(ix = 1; ix < n; ix++) {
        key = p[ix];
        for (jx=ix-1; (jx >= 0) && (p[jx] > key); jx--) // 如果比key大,说明找到了正确的位置,退出内循环后,把key 插入
        {
            p[jx+1] = p[jx];
        }
        p[jx+1] = key;
    }
}
复制代码

 

posted @   靖意风  Views(2)  Comments(2Edit  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示