话不多说!程序员必学的十大算法

可以说十大排序算法是所有程序员都必须掌握的 。花了一天的时间实现并整理了代码 。为了方便大家学习,我把那个总结成了文章 。每个算法都描述了一个简单的算法思想 。为了大家容易理解,我又找来了动态图演示; 这还不够 。我还会附上相应的优质文章,让你来砍我,不想砍我就好看 。

话不多说!程序员必学的十大算法

文章插图
有些人可能不知道什么是稳定排序、就地排序、时间复杂度、空间复杂度,现在我来简单说明一下:
1、稳定排序: a原本在b之前,且a==b,排序后a仍在b之前时,为稳定排序 。
2、不稳定排序: a原本在b之前,且a==b时,排序后a可能不在b之前时,为不稳定排序 。
3、就地排序:就地排序是指在排序过程中不申请额外的存储空间,只利用原存储有待排序数据的存储空间进行比较和交换的数据排序 。
4、非就地排序:需要利用额外的数组辅助排序 。
5、时间复杂度:运行一个算法所需的时间 。
6、空间复杂度:运行完一个算法所需的内存大小 。
话不多说!程序员必学的十大算法

文章插图
10个讲课顺序
为了方便大家寻找,我在这里做了一个假目录,没有跳跃功能 。
照片和视频都在百度上搜索了 。如果有侵害的话,请再联系删除 。谢谢
1、选择排序
过程简要说明:
首先,找到数组中最小的元素 。然后,与数组的第一个元素交换位置 。如果第一个要素是最小的要素,就和自己交换 。然后,在剩下的元素中找到最小的元素,并与数组中的第二个元素交换位置 。往返,直到整个数组被排序 。这种方法称为选择排序 。
为了便于理解,我还准备了动图:
话不多说!程序员必学的十大算法

文章插图
如果还是不懂的话,我给你准备了优质的文章说明 。选择排序
代码如下 。(线绳片可以左右拉 。以下相同) ) 。
1公共类选择
2公共静态int[ ] selectsort(int[ ] a) {
3 intn=a.length;
4for(intI=0; in- 1; I) {
5 intmin=i;
6for(intj=I1; jn; j) {
7if(a[min]a[j] ) min=j;
8 }
9 //更换
10 inttemp=a[i];
11 a[i]=a[min];
12 a[min]=temp;
13 }
14返回a;
15 }
16}
性质: 1、时间复杂度: o(n2 ) 2、空间复杂度: o)1) 3、不稳定排序4、就地排序
2、插入排序
我们打牌的时候,你是怎么整理那些卡片的? 一个简单的方法是一张一来,把每张卡插入其他有序卡中的适当位置 。在对无序数组进行排序时,为了插入元素,必须在插入所有其他元素之前留出向右移动一位的空间 。该算法称为插入排序 。
过程简要说明:
1、从数组的第二个元素中提取元素 。
2、将其与左侧第一个要素进行比较,如果左侧第一个要素大于它,继续与左侧第二个要素进行比较,直到遇到不大于它的要素,并插入该要素的右侧 。
3、继续选择第3、4、n个元素,重复步骤2,选择合适的位置插入 。
为了便于理解,我还准备了动图:
话不多说!程序员必学的十大算法

文章插图
如果还是不懂的话,我给你准备了优质的文章说明 。插入排序
代码如下 。
1公共类插入器{
2公共静态int[ ] insertsort(int[ ] arr) 。
3if(arr==null||arr.length2) ) ) ) ) ) ) ) 。
4返回警报;
5
6 intn=arr.length;
7for(intI=1)
; i < n; i++) {
8 int temp = arr[i];
9 int k = i - 1;
10 while(k >= 0 && arr[k] > temp)
11 k--;
12 //腾出位置插进去,要插的位置是 k + 1;
13 for(int j = i ; j > k + 1; j--)
14 arr[j] = arr[j-1];
15 //插进去
16 arr[k+1] = temp;
17 }
18 return arr;
19 }
20}
性质:1、时间复杂度:O(n2) 2、空间复杂度:O(1) 3、稳定排序 4、原地排序
3、冒泡排序
1、把第一个元素与第二个元素比较,如果第一个比第二个大,则交换他们的位置 。接着继续比较第二个与第三个元素,如果第二个比第三个大,则交换他们的位置….
我们对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样一趟比较交换下来之后,排在最右的元素就会是最大的数 。
除去最右的元素,我们对剩余的元素做同样的工作,如此重复下去,直到排序完成 。
为方便理解我还准备了动图:
话不多说!程序员必学的十大算法


推荐阅读