排序算法学习笔记

1.插入排序

    直接插入

    二分法插入

    希尔插入

2.选择排序

3.交换排序

    冒泡排序

    快速排序

4.归并排序

5.基数排序

 

插入排序

直接插入排序 空间复杂度大,时间复杂度 n^2/2 n平方除以2

插入排序是一种递归思想,由N-1趟排序组成。

初始时,只考虑数组下标0,只有一个元素,默认是有序的。

然后第一趟 对下标为1的元素进行排序,保证数组[0,1]上的元素有序;

第二趟 对下标2处的元素进行排序,保证数组[0,2]上的元素有序;

...

...

第N-1趟对下标N-1处元素进行排序,保证数组[0,N-1]上的元素有序,

它的递归思想体现在:当对位置i处的元素进行排序时,[0,i-1]上的元素一定是有序的了。

public static <T extends Comparable<? super T>> void insertSort(T[] a){ for(int p = 1; p < a.length; p++) { T tmp = a[p];//保存当前位置p的元素,其中[0,p-1]已经有序 int j; for(j = p; j > 0 && tmp.compareTo(a[j-1]) < 0; j--) { a[j] = a[j-1];//后移一位 } a[j] = tmp;//插入到合适的位置 } }

 

 

二分法插入排序(插入到已排好序的数组中)

对left,right赋值与中间一位数比较,

对left,right重新赋值,再与中间值比较

....

直到值一样,或者right-1 = left

把值插入到left的右边

希尔排序(留坑,后面补充)

 

 

选择排序 时间复杂度 : (n+1)n/2

经过N-1趟直接选择排序得到有序结果:

第一趟选择数组中最小的数字,与第一位交换位置,得到1个长度新的有序区域和长度-1的新无序区

第二趟选择无序数组中最小的数组,与第二位交换位置,得到2个长度的有序区域和长度-2的新无序区

...

...

第N-1趟后

得到N个长度的有序区域

 

归并排序比较占用内存,但却是一种高效且稳定的算法。

归并操作(merge):将两个顺序序列合并成一个顺序序列。

交换排序

冒泡排序: 时间复杂度: n^2 n平方

双层for循环

比较相邻的元素,如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。

针对所有的元素重复以上步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

快速排序:

冒泡排序的优化

选择数组首个元素为基数,

比基数大的数字放到基数的后面,比基数小的放到基数前面,使用递归方法不断分割数组。

以此达到整个数据变成有序序列。

基数排序

按照数组中的元素的个位数放到【0,9】的桶子里

个位数是0 放到桶子0里面

个位数是1 放到桶子1里面

...

放完了以后,根据桶子从0-9重新排好序

按照数组中的元素的十位数放到【0,9】的桶子里

十位数是0 放到桶子0里面

十位数是1放到桶子1里面

...

放完了以后,根据桶子从0-9重新排好序。

由最大数字的位数来确定就几轮操作

位数大的使用MSD(最高位优先Most Significant Digit first)方法排序,

位数小的使用LSD (最低位优先Last Significant Digit first)方法排序

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值