经典排序算法

插入排序

//从待排序列中选出一个元素,插入到已经有序的元素之中,直到所有的元素都插入到有序序列中所有的元素就全部有序了
通常的做法就是将第一个元素看做是有序的元素(即待排序列的第一个元素看做是有序序列),然后我们将第二个元素和有序序列(即第一个元
素)作比较,按正确的序列插入到序列中去。然后在将第三个元素和前面有序序列(即整个待排序列的前两个元素)作比较,将第三个插入到前
两个元素中去,使得前三个元素有序。以此类推,直到所有的元素都有序。
a: 4531976  //把序列分成两个序列,a[0]是有序序列a1,a[1]~a[n-1]为无序序列b1,取b1[cur]=5
		  |
		  | // 取出b1[cur]的值5插入a1序列,b1[cur]右移
		 \ /
a: 4531976  //把序列分成两个序列,a[0]~a[1]是有序序列a1,a[2]~a[n-1]为无序序列b1,b1[cur]=3
		  |
		  | // 取出b1[cur]的值3插入a1序列,b1[cur]右移
		 \ /
a: 3451976  //把序列分成两个序列,a[0]~a[2]是有序序列a1,a[3]~a[n-1]为无序序列b1,b1[cur]=1
		  |
		  | // 取出b1[cur]的值1插入a1序列,b1[cur]右移
		 \ /
a: 1345976  //把序列分成两个序列,a[0]~a[3]是有序序列a1,a[4]~a[n-1]为无序序列b1,b1[cur]=9
		  |
		  | // 取出b1[cur]的值9插入a1序列,b1[cur]右移
		 \ /
a: 1345976  //把序列分成两个序列,a[0]~a[4]是有序序列a1,a[5]~a[n-1]为无序序列b1,b1[cur]=7
		  |
		  | // 取出b1[cur]的值7插入a1序列,b1[cur]右移
		 \ /
a: 1345796  //把序列分成两个序列,a[0]~a[5]是有序序列a1,a[6]~a[n-1]为无序序列b1,b1[cur]=6
		  |
		  | // 取出b1[cur]的值6插入a1序列,b1[cur]右移
		 \ /
a: 1345679  //把序列分成两个序列,a[0]~a[6]是有序序列a1
//时间复杂度O(n^2),首先将一个数插入一个有序序列的时间复杂度为O(n),将n-1个无序序列插入有序序列的次数为n-1

归并排序

设待排序的序列为A(n),n表示元素个数。归并排序的核心是归并(把两个有序的序列合并成一个有序的序列)
//分解:对序列进行分解得到n个有序序列(元素个数为一时可看作有序)
//归并:对两个有序的序列进行合并,假设需要合并的两个序列是a1、b1
比较a1、b1当前指向元素,把小的值赋给c1,并且指针往下移动一位
a1: 1569       a1当前指针指向第一个元素1,a1[a_cur]=1
b1: 2478       b1当前指针指向第一个元素2, b1[b_cur]=2 
c1:|
                            | //比较1 < 2 , a1[a_cur]后移一位
                           \ /
a1: 1569       a1当前指针指向第二个元素5,a1[a_cur]=5
b1: 2478       b1当前指针指向第一个元素2, b1[b_cur]=2
c1: 1
                            |
                            | //比较2 < 5, b1[b_cur]后移一位
                           \ /
a1: 1569       a1当前指针指向第二个元素5,a1[a_cur]=5
b1: 2478       b1当前指针指向第二个元素4, b1[b_cur]=4
c1: 12                         
                            |
                            | //比较4 < 5, b1[b_cur]后移一位
                           \ /
a1: 1569       a1当前指针指向第二个元素5,a1[a_cur]=5
b1: 2478       b1当前指针指向第三个元素7, b1[b_cur]=7
c1: 124                    
                            |
                            | //比较5 < 7, a1[a_cur]后移一位
                           \ /
a1: 1569       a1当前指针指向第三个元素6,a1[a_cur]=6
b1: 2478       b1当前指针指向第三个元素7, b1[b_cur]=7
c1: 1245    
                            |
                            | //比较6 < 7, a1[a_cur]后移一位
                           \ /
a1: 1569       a1当前指针指向第四个元素9,a1[a_cur]=9
b1: 2478       b1当前指针指向第三个元素7, b1[b_cur]=7
c1: 12456   
                            |
                            | //比较7 < 9, b1[b_cur]后移一位
                           \ /
a1: 1569       a1当前指针指向第四个元素9,a1[a_cur]=9
b1: 2478       b1当前指针指向第四个元素8, b1[b_cur]=8
c1: 124567   
                            |
                            | //比较8 < 9, b1[b_cur]后移一位
                           \ /
a1: 1569       a1当前指针指向第四个元素9,a1[a_cur]=9
b1: 2478       b1当前指针指向第五个元素null, b1[b_cur]=null,
c1: 1245678
                            |
                            | //b1不存在当前元素了,直接把a1当前元素及后面的元素按顺序添加到c1序列
                           \ /
a1: 1569       a1当前指针指向第五个元素null,a1[a_cur]=null
b1: 2478       b1当前指针指向第五个元素null, b1[b_cur]=null
c1: 12456789

网上找到的归并排序图解
在这里插入图片描述
快速排序

1)假设需要排序的序列为a[n],取一个值作为基准值(可以取a[0]、a[n/2]、a[n]或者任意一个值)a[tmp]
2)根据选取的基准值把序列一分为二,比基准值小的放到左边,比基准值大的放到右边
3)假设左边序列为a1、右边序列为b1;分别对a1、b1进行1)2)步操作
//(n)表示上一步的基准值
a: 91274196324
				  |
				  |  //对a[n]进行划分
				 \ /
a: 7463(9)121924	 
				  |
				  |  //对a1[a]、b1[b]进行划分
				 \ /
a: 463(7)(9)(12)1924
				  |
				  |  //对a2[a]、b2[b]进行划分
				 \ /
a: 463(7)(9)(12)1924
				  |
				  |  //对a3[a]、b3[b]进行划分
				 \ /
a: 3(4)6(7)(9)(12)(19)24

放个大佬的图
在这里插入图片描述
选择排序

假设需要排序的序列为a[n]
初始temp为0,设a[temp]为最小值,按顺序逐一比较,如果a[i]<a[temp]则temp=i,最后拿到整个序列最小值,把最小值交换到前面,如此执行n-1次可完成排序

a: (3)61395  // temp = 0 ; a[temp]==3 ---(比较完)----> temp = 2; a[temp]==1;交换位置
			|
			|
		   \ /
a: 1(6)3395  // temp = 1 ; a[temp]==6 ---(比较完)----> temp = 2; a[temp]==3;交换位置
			|
			|
		   \ /	   
a: 13(6)395  // temp = 2 ; a[temp]==6 ---(比较完)----> temp = 3; a[temp]==3;交换位置
			|
			|
		   \ /	   
a: 133(6)95  // temp = 3 ; a[temp]==6 ---(比较完)----> temp = 5; a[temp]==5;交换位置
			|
			|
		   \ /	   
a: 1335(9)6  // temp = 4 ; a[temp]==9 ---(比较完)----> temp = 5; a[temp]==6;交换位置
			|
			|
		   \ /	   
a: 13356(9)  // temp = 5

冒泡排序

相邻两个元素比较,大的(小的也行)放在后面,每一轮冒泡确定一个最大值,并且这个值不参与下一轮的冒泡,经过n-1轮冒泡可得排序

---------》  a: 463185  
---------》  a: 43165(8)
---------》  a: 3145(6)(8)
---------》  a: 134(5)(6)(8)
---------》  a: 13(4)(5)(6)(8)
---------》  a: 1(3)(4)(5)(6)(8)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值