这周听了小组成员讲Java中的冒泡排序、选择排序和插入排序,记得以前是会了的,可听人家讲的时候又有点懵逼,还是自己再整理一遍吧,毕竟是基础,以后的算法题不知道比这难上几倍,废话不多说,开始:(都是从小到大排的哈)
1、 冒泡排序:
原理:
比较两个相邻的元素,将数值较大的元素交换至右端
算法描述:
比较相邻的元素。如果第一个比第二个大,就交换它们两个;
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
针对所有的元素重复以上的步骤,除了最后一个,直到排序完成。
*N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数
2、选择排序:
原理:
每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。
也就是:每一趟在n-i+1(i=1,2…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录
算法描述:
初始状态:无序区为R[1..n], 有序区为空:
第i趟排序(i=1,2, 3…n-1)开始时,当前有序区和无序区分别为R[1.. i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录R[k], 将它与无序区的第1个记录R交换,使R[1..i]和R[i+1.. n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区:
n-1趟结束,数组有序化了。
*每一趟排序获得最小数的方法:for循环进行比较,定义一个第三个变量temp,首先前两个数比较,把较小的数放在temp中,然后用temp再去跟剩下的数据比较,如果出现比temp小的数据,就用它代替temp中原有的数据。
3、插入排序:
原理:
利用插入法对无序数组排序时,我们其实是将数组R划分成两个子区间R[1…i-1] (已排好序的有序区) 和R[i…n] (当前未排序的部分,可称无序区)
算法描述:
1) 从第一个元素开始,该元素可以认为已经被排序;
2) 取出下一个元素,在已经排序的元素序列中从后向前扫描:
3)如果该元素(已排序)大于新元素,将该元素移到下一位置;
4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5)将新元素插入到该位置后:
重复步骤2~5。
*第N-1趟对下标 N-1 处的元素进行排序,保证数组[0,N-1]上的元素有序,也就是整个数组有序了。
它的递归思想就体现在:当对位置 i 处的元素进行排序时,[0,i-1]上的元素一定是已经有序的了。
就先酱紫!!!