服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 数据结构与算法(常用的排序算法)

数据结构与算法(常用的排序算法)

2023-04-27 11:56编码小哥 编程技术

目前常用的排序算法有多种,包括冒泡排序、插入排序、选择排序、归并排序、快速排序等。本文将逐一介绍每一种排序算法的具体实现方法、优缺点以及时间复杂度等。

数据结构与算法(常用的排序算法)

排序算法是计算机科学领域中非常重要的基础算法之一,主要应用于数据处理中,将未排序的数据按照一定规则排列,以便后续的计算和数据分析。目前常用的排序算法有多种,包括冒泡排序、插入排序、选择排序、归并排序、快速排序等。本文将逐一介绍每一种排序算法的具体实现方法、优缺点以及时间复杂度等。

一、冒泡排序

冒泡排序是一种简单易懂的排序算法,它的基本思路是将待排序的元素比较相邻的两个数,如果前面的数大于后面的数,则交换它们的位置。这样一轮比较下来,最大的数就会被移动到数列的末尾。接下来,再对剩下的数列进行相同的操作,直到排序完成。

冒泡排序的具体实现如下:


void bubble_sort(int arr[], int len) { int i, j, temp; for(i = 0; i < len - 1; i++) { for(j = len - 1; j > i; j--) { if(arr[j] < arr[j - 1]) { temp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = temp; } } } }

冒泡排序的优点是实现简单易懂,缺点是时间复杂度较高,为O(n^2),在数据量较大的情况下比较耗时,不适合处理大规模数据。

二、插入排序

插入排序是一种直观、简单的排序算法,它的基本思路是将待排序的元素逐个插入到已排好序的序列中,以保证插入后的序列仍然有序。插入排序分为直接插入排序和希尔排序两种。

1、直接插入排序

直接插入排序的具体实现如下:


void insert_sort(int arr[], int len) { int i, j, temp; for(i = 1; i < len; i++) { temp = arr[i]; j = i - 1; while(j >= 0 && arr[j] > temp) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = temp; } }

直接插入排序的优点是实现简单,对于数据量较小的情况下性能较好。缺点是时间复杂度为O(n^2),同样不适合处理大规模数据。

2、希尔排序

希尔排序是插入排序的一种改进算法,它的基本思路是通过将序列分成若干个子序列来进行插入排序,使得整个序列基本有序,然后再对整个序列进行插入排序。希尔排序具有时间复杂度为O(n^(3/2))的优点,在实际应用中性能较好。

希尔排序的具体实现如下:


void shell_sort(int arr[], int len) { int i, j, gap, temp; for(gap = len / 2; gap > 0; gap /= 2) { for(i = gap; i < len; i++) { temp = arr[i]; j = i - gap; while(j >= 0 && arr[j] > temp) { arr[j + gap] = arr[j]; j -= gap; } arr[j + gap] = temp; } } }

三、选择排序

选择排序是一种简单直观的排序算法,它的基本思路是将待排序的序列分成已排序和未排序两部分,从未排序的部分中找到最小的元素,将其放到已排序部分的末尾。接着再从未排序部分中继续寻找最小的元素,重复上述过程,直到最终排序完成。

选择排序的具体实现如下:


void select_sort(int arr[], int len) { int i, j, k, temp; for(i = 0; i < len - 1; i++) { k = i; for(j = i + 1; j < len; j++) { if(arr[j] < arr[k]) { k = j; } } if(k != i) { temp = arr[i]; arr[i] = arr[k]; arr[k] = temp; } } }

选择排序的优点是实现简单直观,缺点是时间复杂度较高,为O(n^2),同样不适合处理大规模数据。

四、归并排序

归并排序是一种非常高效的排序算法,它的基本思路是分治法,将待排序的序列分成若干个单独的子序列,分别对每个子序列进行排序,最后将排序好的子序列合并,形成一个排好序的序列。

归并排序的具体实现如下:


void merge_sort(int arr[], int len) { int *a = arr; int *b = (int*)malloc(len*sizeof(int)); int seg, start; for(seg = 1; seg < len; seg += seg) { for(start = 0; start < len; start += seg+seg) { int low = start, mid = min(start+seg, len), high = min(start+seg+seg, len); int k = low; int start1 = low, end1 = mid; int start2 = mid, end2 = high; while(start1 < end1 && start2 < end2) { b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++]; } while(start1 < end1) { b[k++] = a[start1++]; } while(start2 < end2) { b[k++] = a[start2++]; } } int *temp = a; a = b; b = temp; } if(a != arr) { int i; for(i = 0; i < len; i++) { b[i] = a[i]; } b = a; } free(b); }

归并排序的优点是具有时间复杂度为O(nlogn)的优点,适合处理大规模的数据。缺点是空间开销较大,需要额外的内存空间进行归并操作。

五、快速排序

快速排序是一种高效的排序算法,它的基本思路是分治法,选取一个中间的基准值,将序列分成两个子序列,一边小于基准值,一边大于基准值,再对这两个子序列进行递归操作,直到排序完成。

快速排序的具体实现如下:


void quick_sort(int arr[], int left, int right) { int i, j, pivot, temp; if(left < right) { i = left; j = right; pivot = arr[left]; while(i < j) { while(i < j && arr[j] >= pivot) { j--; } if(i < j) { arr[i++] = arr[j]; } while(i < j && arr[i] < pivot) { i++; } if(i < j) { arr[j--] = arr[i]; } } arr[i] = pivot; quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right); } }

快速排序的优点是具有时间复杂度为O(nlogn)的优点,适合处理大规模的数据。缺点是对于特殊情况下容易出现性能退化,需要进行优化。

小结

各种排序算法各有优缺点,在实际应用中需要根据具体场景选择适合的排序算法,以求得最佳的性能和效率。

原文地址:https://www.toutiao.com/article/7223910612215382539/

延伸 · 阅读

精彩推荐
  • 编程技术网站性能优化之HTTP请求过程简述

    网站性能优化之HTTP请求过程简述

    网站性能优化中首要的一条就是要减少HTTP请求,那么为要减少HTTP请求呢?其实有些HTTP分析工具可以帮我们了解当浏览器请求一个资源时大致需要经历的哪...

    编程技术网2022020-07-21
  • 编程技术这个改变,让应用程序既好做又好用!

    这个改变,让应用程序既好做又好用!

    微服务架构可以帮助企业摆脱在开发和拓展应用程序上的困境。微服务架构具体能做什么?又会产生哪些成本?让我们一起来看看今天的干货分享!...

    计算机世界7832021-12-09
  • 编程技术Medusa 又一个 Shopify 的开源替代品!

    Medusa 又一个 Shopify 的开源替代品!

    Medusa是一个开源的headless商务引擎,具有速度快且可定制的优点。由于 Medusa 分为 3 个核心组件 - 公开的REST API headless商务部分、商店的前端以及admin面板 ...

    程序员巴士5412021-12-29
  • 编程技术如何封装不被嫌弃的组件SDK

    如何封装不被嫌弃的组件SDK

    封装一个不被吐槽的SDK组件,需要明确组件职责,知道SDK能从宿主环境获得什么能力,完善的ts声明与错误边界,灵活的导出产物,让业务能舒服接入,上...

    魔术师卡颂5422021-05-04
  • 编程技术chatGPT代码写的有点好啊,程序员要失业了?

    chatGPT代码写的有点好啊,程序员要失业了?

    ChatGPT 是一个基于对话的原型 AI 聊天机器人,12 月 1 日,OpenAI 的联合创始人山姆·奥特曼(Sam Altman)在推特上公布 ChatGPT 并邀请人们免费试用。经网友测试...

    Hollis6012022-12-07
  • 编程技术为什么人们还没有转向Svelte

    为什么人们还没有转向Svelte

    Svelte是一个轻量级的基于组件的框架,比如React、Vue或Angular也都是,它允许开发人员用JavaScript编写易于阅读的代码,然后将编写的代码编译成在浏览器中运...

    今日头条11532021-02-01
  • 编程技术技能篇:Git的简易教程

    技能篇:Git的简易教程

    一个项目的往往是由多个人实现,此时就有一个问题,代码提交和代码合并。git和svn,这篇文章来讲讲git的原理和使用...

    潜行前行5892021-08-04
  • 编程技术如何替换URL中的Query字段?

    如何替换URL中的Query字段?

    由于ParseResult对象的.query属性是只读属性,不能覆盖,因此我们需要调用一个内部方法._replace把新的.query字段替换上去,生成新的 ParseResult对象。最后再把...

    未闻Code7982021-08-31