排序算法十大经典方法?

203 2023-11-07 15:53

一、排序算法十大经典方法?

十大排序算法可以说是每个程序员都必须得掌握的了,花了一天的时间把代码实现且整理了一下,为了方便大家学习,我把它整理成一篇文章,每种算法会有简单的算法思想描述,为了方便大家理解,我还找来了动图演示;这还不够,我还附上了对应的优质文章,看完不懂你来砍我,如果不想砍我就给我来个好看。

术语解释

有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下:

1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。

2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。

3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。

4、非原地排序:需要利用额外的数组来辅助排序。

5、时间复杂度:一个算法执行所消耗的时间。

6、空间复杂度:运行完一个算法所需的内存大小。

十大排序

为了方便大家查找,我这里弄一个伪目录。

选择排序

插入排序

冒泡排序

非优化版本

优化版本

希尔排序

归并排序

递归式归并排序

非递归式归并排序

快速排序

堆排序

基数排序

非优化版本

优化版本

桶排序

基数排序

二、猴子排序算法?

猴子排序是一种什么样子的排序呢?

猴子代表乱的意思,猴子排序的意思就是乱排序,直到有序为止。

这个真实的含义就是把一个无序的数组进行乱排序,然后看其是否会有序,这是个概率性事件,有可能一次之后就有序了,也有可能很多次后依然无序。

实现方法如下:

1,定义数组

2,数组随机

3,检验数组是否有序,无序继续,有序了就停止

就是如此简单的实现思路,但是却要用到随机化的知识和标志变量的实现技巧

代码如下: //得到的数据是说明了排序多少次之后才有序

#include <iostream>

using namespace std;

int source[10],flag[10],res[10];

int sort(){

memset(flag,1,sizeof(flag));

int num = 10,count=0;

while(num){

int t =rand()%10; //生成0-9之间的数

if(flag[t]){

res[count++] = source[t];

num--;

}

}

for(int i=0;i<9;i++){

if(res[i]>res[i+1]){ //只有是从小到大的排列才行

return 0;

}

}

return 1;

}

int main(){

int count = 0;

for(int i=0;i<10;i++){

cin>>source[i];

}

while(sort()!=1){

count++;

}

cout<<"共运行了"<<count<<"次"<<endl;

return 0;

}

三、python 排序算法?

1、冒泡排序

它反复访问要排序的元素列,并依次比较两个相邻的元素。

2、选择排序

首次从待排序的数据元素中选择最小(或最大)的元素,存储在序列的开始位置。

3、插入排序

对于未排序的数据,通过构建有序的序列,在已排序的序列中从后向前扫描,找到相应的位置并插入。插入式排序在实现上。

4、快速排序

将要排序的数据通过一次排序分成两个独立的部分。

5、希尔排序(插入排序改进版)

将要排序的一组数量按某个增量d分为几个组,

6、归并排序,首先递归分解组,然后合并组。

基本思路是比较两个数组的面的数字,谁小就先取谁,取后相应的指针向后移动一个。然后再比较,直到一个数组是空的,最后复制另一个数组的剩余部分。

四、路径排序算法?

1 public class SelectSort {

2 public static int[] selectSort(int[] a) {

3 int n = a.length;

4 for (int i = 0; i < n - 1; i++) {

5 int min = i;

6 for (int j = i + 1; j < n; j++) {

7 if(a[min] > a[j]) min = j;

8 }

9 //交换

10 int temp = a[i];

11 a[i] = a[min];

12 a[min] = temp;

13 }

14 return a;

15 }

16 }

性质:1、时间复杂度:O(n2) 2、空间复杂度:O(1) 3、非稳定排序 4、原地排序

五、快递排序算法?

算法原理:类似于归并排序,快速排序是基于分治模式。具体有以下三个步骤:

1分解:数组A[left..right]被划分为两个(可能为空)子数组A[left..q-1]和A[q+1..right],使得A[left..q-1]中的每一个元素都小于等于A[q],而且小于等于A[q+1..right]中的每一个元素。下标q也在这个划分过程中进行计算。

2解决:通过递归调用快速排序,对子数组A[left..q-1]和A[q+1..right]排序。

3合并:因为两个子数组是就地排序的,将它们的合并不需要操作:整个数组A[left..right]已排序。

六、希尔排序算法?

希尔排序(Shell's Sort)算法是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

七、msd排序算法?

MSD的算法思路如下:

1、MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个组中建立“子组”。

2、将每个桶子中的数值按照下一数位的值分配到“子组”中。在进行完最低位数的分配后再合并回单一的数组中。即先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。所以,MSD方法用递归的思想实现最为直接。

八、冒泡排序算法对于其他排序算法的优点的?

冒泡算法相对其他算法的优点是容易理解,代码量少。

九、目标排序常用算法?

1选择排序

找到数组中最小的元素,和第一个元素交换,再在剩余的元素中(未排序元素)找到最小的元素,和第二个元素交换,如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它不断地在剩余元素中选择最小者。

2插入排序

插入排序比较类似与我们生活中给一副乱序的扑克牌排序的过程,从第一张牌开始,第一张牌先放着,第二张牌和第一张牌比较,小的放前面,第三张牌在与前面两张比较,插入到合适的位置,特点是前面的牌是排好顺序的,后面拿出的牌根据大小再去排好位置。具体过程是:新拿到的牌先和排序好的最后一张牌比较,若是新牌大,结束,否则就交换,这样依次交换,直到把新牌放入合适位置。

十、plc冒泡排序算法?

你好,PLC(可编程逻辑控制器)通常不是用于执行排序算法的。但是,如果要使用PLC实现冒泡排序算法,可以使用以下步骤:

1. 初始化数组并将其存储在PLC中。

2. 编写一个循环,将数组中的元素两两比较,并根据需要将它们交换位置。

3. 继续循环,直到数组中的所有元素都已排序。

4. 输出已排序的数组。

以下是一个简单的PLC冒泡排序算法示例:

```

VAR

i : INT := 0;

j : INT := 0;

temp : INT := 0;

arr : ARRAY[1..10] OF INT := [10, 2, 8, 4, 6, 9, 1, 3, 7, 5];

END_VAR

FOR i:=1 TO 10 DO

FOR j:=1 TO 9 DO

IF arr[j] > arr[j+1] THEN

temp := arr[j];

arr[j] := arr[j+1];

arr[j+1] := temp;

END_IF

END_FOR

END_FOR

// 输出已排序的数组

FOR i:=1 TO 10 DO

// 输出数组元素

// ...

END_FOR

```

以上代码将数组元素两两比较,并根据需要将它们交换位置,直到整个数组都被排序。最后,通过循环输出已排序的数组。

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
点击我更换图片