4种编程中常考的排序方法(选择,冒泡,快速,二路归并)

简介: 4种编程中常考的排序方法(选择,冒泡,快速,二路归并)

1丶选择排序


选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

我们来看一下代码:

void SelectionSort(int arr[]) {
  for (int i = 0; i < 9; i++) {
  for (int j = i + 1; j < 10; j++) {
    if (arr[i] > arr[j]) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
    }
  }
  }
}


我们来看一个实例:

#include <stdio.h>
#include <string.h>
void SelectionSort(int arr[]) {
  for (int i = 0; i < 9; i++) {
  for (int j = i + 1; j < 10; j++) {
    if (arr[i] > arr[j]) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
    }
  }
  }
}
int main() {
  int arr[10] = { 7,6,4,2,1,7,9,6,4,6 };
  for (int i = 0; i < 10; i++) {
  printf("%d", arr[i]);   //打印排序前的数组
  }
  printf("\n");
  SelectionSort(arr);
  for(int i = 0; i < 10; i++) {
  printf("%d",arr[i]);   //打印排序后的数组
  }
  return 0;
}


我们来看一下运行结果:

打印前是乱序,打印后是有序的,说明我们的算法没问题。


2丶冒泡排序


冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个排序之前的文章写过,下面为原文链接:

[冒泡排序](https://blog.csdn.net/weixin_63257947/article/details/123186460)


3丶快速排序


快速排序(Quicksort)是对冒泡排序的改进,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


代码:

void quickSort(int a[], int left, int right)    //start和end都是指下标
{
  if (left > right)          //如果左边下标比右边大,是不合法的
  return;
    int base = a[left];      //保存基准数
    int i = left;
    int j = right;
  while (i != j)
  {
  while (a[j] >= base && i < j) {
    j--;
  }
  while (a[i] <= base && i < j) {
    i++;
  }
  if (j > i) {
    int tmp = a[i];        //i和j都停下,交换i和j的元素
    a[i] = a[j];
    a[j] = tmp;
  }
  }
  a[left] = a[i];
  a[i] = base;       //把基准数赋值给相遇位置的元素
  quickSort(a, left, i - 1);  //左边递归进行快速排序
  quickSort(a, j+1, right);   //右边递归进行快速排序
}


实例:


4丶归并排序


归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

代码:

void Emergesort(int arr[],int left,int right) {
  if (left >= right)
  return ;
  int mid = (left + right) / 2;
  int* temp = (int*)malloc(sizeof(int) * (right - left + 1));
  if (temp == NULL)
  return;
  Emergesort(arr, left, mid);    //左边归并
  Emergesort(arr, mid + 1, right); //右边归并
  int i = left;
  int j = mid+1;
  int k = 0;
  while (i <= mid && j <= right) {
   if (arr[i] < arr[j])
    temp[k++] = arr[i++];
   else
   temp[k++] = arr[j++];   //有序放入辅助数组
  }
  while (i <= mid) {
   temp[k++] = arr[i++];
  }
  while (j <= right) {
   temp[k++] = arr[j++];
  }
  for (i = 0; i <= right - left; i++) {
   arr[left+i] = temp[i];   //辅助数组给原数组赋值
  }
}


实例:

排序成功

目录
相关文章
|
运维 监控 安全
构建高效运维体系:从监控到自动化的全方位实践
本文深入探讨了构建高效运维体系的关键要素,从监控、日志管理、自动化工具、容器化与微服务架构、持续集成与持续部署(CI/CD)、虚拟化与云计算以及安全与合规等方面进行了全面阐述。通过引入先进的技术和方法,结合实际案例和项目经验,为读者提供了一套完整的运维解决方案,旨在帮助企业提升运维效率,降低运营成本,确保业务稳定运行。
|
存储 JSON 关系型数据库
mysql中find_in_set()函数用法详解及增强函数
总结而言,`FIND_IN_SET()`是MySQL中处理由逗号分隔的字符串列表的一种便捷方法,尤其适用于列表相对较短且不经常更改的场景。然而,对于更为复杂的需要高性能和可扩展性的数据库设计,它可能不是最优选择,应考虑使用更加正规化的数据库结构。
1800 2
mysql中find_in_set()函数用法详解及增强函数
|
机器学习/深度学习 人工智能 语音技术
人工智能发展的积极影响有哪些?
人工智能发展的积极影响有哪些?
1345 0
|
SQL 存储 监控
MySQL从库维护经验分享
MySQL 主从架构应该是最常用的一组架构了。从库会实时同步主库传输来的数据,一般从库可以作为备用节点或作查询使用。其实不只是主库需要多关注,从库有时候也要经常维护,本篇文章将会分享几点从库维护经验,一起来学习吧。
318 0
|
Linux Shell 开发工具
|
3天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。
|
9天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
8天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
8天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。