八种排序算法
- 格式:docx
- 大小:13.43 KB
- 文档页数:1


本文由西安白癜风专科医院 / 收集,转载请注明出处
本文由西安白癜风专科医院 / 收集,转载请注明出处
八大排序算法 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。
1.插入排序—直接插入排序(Straight Insertion Sort)
基本思想: 本文由西安白癜风专科医院 / 收集,转载请注明出处
本文由西安白癜风专科医院 / 收集,转载请注明出处 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。 要点:设立哨兵,作为临时存储和判断数组边界之用。 直接插入排序示例: 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。 算法的实现: 1. void print(int a[], int n ,int i){ 2. cout<
本文由西安白癜风专科医院 / 收集,转载请注明出处 13. if(a[i] < a[i-1]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入 14. int j= i-1; 15. int x = a[i]; //复制为哨兵,即存储待排序元素 16. a[i] = a[i-1]; //先后移一个元素 17. while(x < a[j]){ //查找在有序表的插入位置 18. a[j+1] = a[j]; 19. j--; //元素后移 20. } 21. a[j+1] = x; //插入到正确位置 22. } 23. print(a,n,i); //打印每趟排序的结果 24. } 25. 26. } 27. 28. int main(){ 29. int a[8] = {3,1,5,7,2,4,9,6}; 30. InsertSort(a,8); 31. print(a,8,8); 32. } 效率: 时间复杂度:O(n^2). 其他的插入排序有二分插入排序,2-路插入排序。 2. 插入排序—希尔排序(Shell`s Sort)
软件工程师常见算法分析
一、概述
在软件开发中,算法是程序员必备的核心能力之一。算法是解决问题的方法和步骤,是一种数学思维方式的体现。对于软件工程师而言,常见的算法分析是学习和掌握各种算法的性能特点,选择合适的算法来解决具体的问题。本文将介绍一些常见的算法以及其分析。
二、冒泡排序算法
冒泡排序是一种简单且常见的排序算法。它通过不断比较相邻的两个元素,并根据规则交换位置,实现将较大(或较小)的元素逐渐“冒泡”到最终位置的目的。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。
三、插入排序算法
插入排序是一种简单且高效的排序算法。它将数组分为已排序和未排序两个部分,逐个将未排序的元素插入到已排序的部分中,使得整个数组有序。插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。
四、选择排序算法
选择排序是一种简单但较低效的排序算法。它通过不断选择最小(或最大)的元素,并放置到已排序部分的末尾,实现整个数组的排序。选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。
五、快速排序算法 快速排序是一种高效的排序算法。它采用分治思想,通过确定一个基准元素,将数组划分为两个子数组,并递归地对子数组进行排序,最终实现整个数组的排序。快速排序的时间复杂度通常为O(nlogn),空间复杂度为O(logn)。
六、二分查找算法
二分查找是一种常见的搜索算法。它适用于有序数组,通过不断将待查找区间缩小为一半,最终找到目标元素的位置。二分查找的时间复杂度为O(logn),空间复杂度为O(1)。
七、动态规划算法
动态规划是一种常见且重要的算法思想。它通过将大问题拆分为子问题,并存储子问题的解,避免重复计算,从而提高算法的效率。常见的动态规划问题包括斐波那契数列、背包问题等。
八、贪心算法
贪心算法是一种简单且常用的算法思想。它通过每一步选择当前状态下的最优解,从而希望得到全局最优解。贪心算法通常适用于当局部最优解能够导致全局最优解的情况。
⼋⼤排序算法——快速排序(动图演⽰思路分析实例代码Java复杂度分
析)⼀、动图演⽰
⼆、思路分析
快速排序的思想就是,选⼀个数作为基数(这⾥我选的是第⼀个数),⼤于这个基数的放到右边,⼩于这个基数的放到左边,等于这
个基数的数可以放到左边或右边,看⾃⼰习惯,这⾥我是放到了左边,
⼀趟结束后,将基数放到中间分隔的位置,第⼆趟将数组从基数的位置分成两半,分割后的两个的数组继续重复以上步骤,选基数,
将⼩数放在基数左边,将⼤数放到基数的右边,在分割数组,,,直到数组不能再分为⽌,排序结束。
例如从⼩到⼤排序:
1. 第⼀趟,第⼀个数为基数temp,设置两个指针left = 0,right = n.length,
①从right开始与基数temp⽐较,如果n[right]>基数temp,则right指针向前移⼀位,继续与基数temp⽐较,直到不满⾜n[right]>基
数temp
②将n[right]赋给n[left]
③从left开始与基数temp⽐较,如果n[left]<=基数temp,则left指针向后移⼀位,继续与基数temp⽐较,直到不满⾜n[left]<=基数
temp
④将n[left]赋给n[rigth]
⑤重复①-④步,直到left==right结束,将基数temp赋给n[left]
2. 第⼆趟,将数组从中间分隔,每个数组再进⾏第1步的操作,然后再将分隔后的数组进⾏分隔再快排,
3. 递归重复分隔快排,直到数组不能再分,也就是只剩下⼀个元素的时候,结束递归,排序完成
根据思路分析,第⼀趟的执⾏流程如下图所⽰:
三、负杂度分析
1. 时间复杂度:
最坏情况就是每⼀次取到的元素就是数组中最⼩/最⼤的,这种情况其实就是冒泡排序了(每⼀次都排好⼀个元素的顺序)
这种情况时间复杂度就好计算了,就是冒泡排序的时间复杂度:T[n] = n * (n-1) = n^2 + n;
最好情况下是O(nlog2n),推导过程如下:
(递归算法的时间复杂度公式:T[n] = aT[n/b] + f(n) )
算力算法10条
算力算法是指用来解决计算问题的一系列步骤或规则。算力算法的设计和优化对于提高计算效率和准确性非常重要。本文将介绍十条常见的算力算法,包括贪心算法、动态规划、回溯算法、分治算法、排序算法、搜索算法、图算法、字符串匹配算法、几何算法和机器学习算法。
一、贪心算法
贪心算法是一种通过每一步的局部最优选择来达到全局最优解的算法。它适用于一些特定问题,如最小生成树、最短路径和背包问题等。贪心算法的实现通常比较简单,但并不一定能得到最优解。
二、动态规划
动态规划是一种通过将问题分解成子问题并分别求解,再组合子问题的解来得到原问题的解的算法。动态规划的核心思想是记忆化搜索和状态转移方程。它适用于一些具有重叠子问题和最优子结构性质的问题,如背包问题、最长公共子序列和最短路径等。
三、回溯算法
回溯算法是一种通过不断尝试不同的选择来解决问题的算法。它适用于一些需要搜索全部可能解空间的问题,如八皇后问题和组合问题等。回溯算法的核心思想是深度优先搜索和剪枝操作。
四、分治算法 分治算法是一种将问题分解成多个相同或类似子问题,并分别求解子问题,再将子问题的解合并得到原问题的解的算法。分治算法通常通过递归实现,它适用于一些具有重叠子问题和可并行性的问题,如归并排序和快速排序等。
五、排序算法
排序算法是一种将一组数据按照某种规则进行排列的算法。常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。排序算法的选择取决于数据规模和性能要求。
六、搜索算法
搜索算法是一种在给定的搜索空间中找到目标元素的算法。常见的搜索算法包括线性搜索、二分搜索、广度优先搜索和深度优先搜索等。搜索算法的选择取决于搜索空间的结构和目标元素的特点。
七、图算法
图算法是一种解决图结构相关问题的算法。常见的图算法包括图的遍历、最短路径、最小生成树和拓扑排序等。图算法的核心思想是图的表示和图的遍历。
八、字符串匹配算法