【C语言】数组排序方法总结

简介: 相邻元素两两比较,按照要求交换位置,n个元素一共要比较n-1趟,每趟要两两比较未排序元素个数-1次。

一.冒泡排序

相邻元素两两比较,按照要求交换位置,n个元素一共要比较n-1趟,每趟要两两比较未排序元素个数-1次。

#include<stdio.h>
void bubble_sort(int* p, int len)//函数实现
{
  int i = 0;
  int j = 0;
  for (i = 0; i < len - 1; i++)//需要进行len-1趟
  {
  int flag = 1;//flag=1,说明已经排好序
  for (j = 0; j < len - 1 - i;j++)//每趟两两比较较未排好序元素个数-1次。
  {
    if (p[j] > p[j+1])
    {
    int tmp = p[j];
    p[j] = p[j + 1];
    p[j + 1] = tmp;
    flag = 0;
    }
  }
  if (flag==1)//判断是否排好序
    break;
  }
}
int main()
{
  int arr[] = { 1,5,9,11,46,79,12 };
  int sz = sizeof arr / sizeof arr[0];
  bubble_sort(arr,sz);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  return 0;
}

20210125162435206.png

二.选择排序

从小到大排序,拿第一个位置的元素去和后面的元素比,找到最小的,二者位置上的元素进行交换,在拿第二个位置的元素和后面的比,以此类推。


#include<stdio.h>
void selection_sort(int* p, int len)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < len - 1; i++)
  {
  int index = i;
  for (j = i + 1; j < len; j++)
  {
    if (p[index] > p[j])
    index = j;
  }
  if (index != i)
  {
    int tmp = p[index];
    p[index] = p[i];
    p[i] = tmp;
  }
  }
}
int main()
{
  int arr[] = { 11,55,1,6,89,23 };
  int sz = sizeof arr / sizeof arr[0];
  selection_sort(arr, sz);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  return 0;
}

20210125163942354.png

三.快速排序


头文件:stdlib.h

结构:void qsort(数组名,数组长度,数组元素大小,自定义的函数cmp)


1.对int类型数组排序


int arr[10];
sample:
int cmp(const void* a,const void* b)
{
return * (int*)a- * (int*)b;
}
qsort(arr, 10, sizeof(arr[0]), cmp);
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* a, const void* b)
{
  return *(int*)a - *(int*)b;//这是顺序排列,若改为* (int*)b- * (int*)a就是逆序排列(下同
}
int main()
{
  int arr[] = { 15,3,47,59,13,2,1 };
  int sz = sizeof arr / sizeof arr[0];
  qsort(arr, sz, sizeof arr[0], cmp);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  return 0;
}

20210125170159525.png

2.对double类型数组排序


double arr[10];
sample:
int cmp(const void* a,const void* b)
{
return * (double* )a>* (double*)b ? 1:-1
}
qsort(arr,10,sizeof(arr[0]),cmp);
#include<stdlib.h>
#include<stdio.h>
void cmp(const void* a, const void* b)
{
  return *(double*)a > *(double*)b ? 1 : -1;
}
int main()
{
  double arr[] = { 6.6 ,1.1,3.3,5.5,7.7};
  int sz = sizeof arr / sizeof arr[0];
  qsort(arr, sz, sizeof arr[0], cmp);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%f ", arr[i]);
  }
  return 0;
}


image.png


相关文章
|
2月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
51 6
|
3月前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
32 3
|
7月前
|
C语言
c语言左旋字符串问题(不同方法超详细解答)
c语言左旋字符串问题(不同方法超详细解答)
32 1
|
7月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
136 7
|
8月前
|
传感器 人工智能 物联网
【C 言专栏】C 语言与硬件交互的方法
【5月更文挑战第4天】C 语言在硬件交互中扮演关键角色,主要通过直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射I/O和设备驱动程序开发。挑战包括硬件多样性、实时性要求和错误处理。随着物联网和人工智能发展,C语言与硬件交互的需求增加,未来将面临更多新硬件和技术的挑战。本文旨在帮助读者理解和掌握这一领域的知识,以实现更高效的硬件互动。
220 1
【C 言专栏】C 语言与硬件交互的方法
|
7月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
52 1
|
7月前
|
IDE 编译器 开发工具
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
详细解读C语言程序设计:现代方法(第2版)第二章全部习题答案
47 0
|
7月前
|
C语言
|
7月前
|
存储 C语言
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
|
8月前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
72 5