关于 qsort 的使用和延伸(模仿 qsort 写一个冒泡排序)

qsort 原型

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

base:指向要排序的数组的第一个对象的指针,该对象转换为void*
num:数组的元素个数
size:数组中每个元素的大小
compar:指向比较两个元素的功能函数

qsort 使用

其实就是描述比较两个元素的功能函数的过程

// 比较整形元素
int cmp1(const void* x, const void* y) {    
  return (*(int*)x) - (*(int*)y);    
}    
// 比较字符型元素
int cmp2(const void* x, const void* y) {    
  return (*(char*)x) - (*(char*)y);    
}    
// 比较字符串
int cmp3(const void* x, const void* y) {    
  return strcmp(*(char**)x, *(char**)y);    
}   
// 比较浮点型元素
int cmp4(const void* x, const void* y) {    
  return (*(double*)x) - (*(double*)y);    
}    

测试:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
  size_t i = 0;
  int arr1[] = {9, 5, 2, 7};
  qsort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), cmp1);
  for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); ++i) {
    printf("%d ", arr1[i]);
  }
  printf("\n");
  char arr2[] = {'s', 'o', 'c', 'k'};
  qsort(arr2, sizeof(arr2) / sizeof(arr2[0]), sizeof(arr2[0]), cmp2);
  for(i = 0; i < sizeof(arr2) / sizeof(arr2[0]); ++i) {
    printf("%c ", arr2[i]);
  }
  printf("\n");
  const char* arr3[] = {"sock", "mark", "mike", "zero"};
  qsort(arr3, sizeof(arr3) / sizeof(*arr3), sizeof(*arr3), cmp3);
  for (i = 0; i < sizeof(arr3) / sizeof(*arr3); ++i) {
    printf("%s ", arr3[i]);
  }
  printf("\n");
  double arr4[] = {3.14, 6.18, 1.11, 9.99};
  qsort(arr4, sizeof(arr4) / sizeof(arr4[0]), sizeof(arr4[0]), cmp4);
  for (i = 0; i < sizeof(arr4) / sizeof(arr4[0]); ++i) {
    printf("%lf ", arr4[i]);
  }
  printf("\n");
  return 0;                                                                                                                             
}

效果:
在这里插入图片描述

qsort 延伸 --> 模仿 qsort 写一个冒泡排序

// 按字节来比较两个元素
int cmp(const void* x, const void* y) {    
  return (*(char*)x) - (*(char*)y);    
}    
// 将元素按字节交换
void Swap(char* buf1, char* buf2, size_t size) {    
  size_t i = 0;    
  for (i = 0; i < size; ++i) {    
    char tmp = *buf1;    
    *buf1 = *buf2;    
    *buf2 = tmp;    
    ++buf1;    
    ++buf2;    
  }    
}    
// 模仿 qsort 写一个冒泡排序
void bubble_sort(void* base, size_t num, size_t size, int(*compar)(const void*, const void*)) {
  size_t i = 0;
  size_t j = 0;
  for (i = 0; i < num - 1; ++i) {
    for (j = 0; j < num - i - 1; ++j) {
      int ret = compar((char*)base + j * size, (char*)base + (j + 1) * size);
      // 按升序来进行排列
      if (ret > 0) {
        Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
      }
    }
  }
}             

测试:

#include <stdio.h>
int main() {
  size_t i = 0;
  int arr1[] = {9, 5, 2, 7};
  bubble_sort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), cmp);
  for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); ++i) {
    printf("%d ", arr1[i]);
  }
  printf("\n");
  char arr2[] = {'s', 'o', 'c', 'k'};
  bubble_sort(arr2, sizeof(arr2) / sizeof(arr2[0]), sizeof(arr2[0]), cmp);
  for (i = 0; i < sizeof(arr2) / sizeof(arr2[0]); ++i) {
    printf("%c ", arr2[i]);
  }
  printf("\n");
  return 0;
}

效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值