一、冒泡排序:
冒泡算法原理:冒泡算法就是依次比较数组中相邻的两个元素,如果左边比右边大则进行调换,以此类推,这样第一次排序就把最大的元素放在最底下。
举例说明:要排序数组:int[] arr = {7, 2, 6, 5, 9, 4};
第1轮排序前数组为:[7, 2, 6, 5, 9, 4]
第1轮第1次比较:7大于2交换位置:[2, 7, 6, 5, 9, 4]
第1轮第2次比较:7大于6交换位置:[2, 6, 7, 5, 9, 4]
第1轮第3次比较:7大于5交换位置:[2, 6, 5, 7, 9, 4]
第1轮第4次比较:7小于9不交换位置:[2, 6, 5, 7, 9, 4]
第1轮第5次比较:9大于4交换位置:[2, 6, 5, 7, 4, 9]
第1轮排序后数组为:[2, 6, 5, 7, 4, 9]
第2轮排序前数组为:[2, 6, 5, 7, 4, 9]
第2轮第1次比较:2小于6不交换位置:[2, 6, 5, 7, 4, 9]
第2轮第2次比较:6大于5交换位置:[2, 5, 6, 7, 4, 9]
第2轮第3次比较:6小于7不交换位置:[2, 5, 6, 7, 4, 9]
第2轮第4次比较:7大于4交换位置:[2, 5, 6, 4, 7, 9]
第2轮排序后数组为:[2, 5, 6, 4, 7, 9]
第3轮排序前数组为:[2, 5, 6, 4, 7, 9]
第3轮第1次比较:2小于5不交换位置:[2, 5, 6, 4, 7, 9]
第3轮第2次比较:5小于6不交换位置:[2, 5, 6, 4, 7, 9]
第3轮第3次比较:6大于4交换位置:[2, 5, 4, 6, 7, 9]
第3轮排序后数组为:[2, 5, 4, 6, 7, 9]
第4轮排序前数组为:[2, 5, 4, 6, 7, 9]
第4轮第1次比较:2小于5不交换位置:[2, 5, 4, 6, 7, 9]
第4轮第2次比较:5大于4交换位置:[2, 4, 5, 6, 7, 9]
第4轮排序后数组为:[2, 4, 5, 6, 7, 9]
第5轮排序前数组为:[2, 4, 5, 6, 7, 9]
第5轮第1次比较:2小于4不交换位置:[2, 4, 5, 6, 7, 9]
第5轮排序后数组为:[2, 4, 5, 6, 7, 9]
已排序后的数组为:[2, 4, 5, 6, 7, 9]
由此可见:N个数字要排序完成,总共进行N-1轮排序,每i轮的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即
for(int i=0;i for(int j=0;j //交换位置 } 冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一轮比较之后,排在最后的一个数一定是最大的一个数,第二轮排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二轮比较的数后面,第三轮比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,每进行一轮比较,每一轮少比较一次,一定程度上减少了算法的量。 因此冒泡排序总的时间复杂度为O(n*n) 代码例子: 二、快速排序 快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。 一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。 接着分别比较左右两边的序列,重复上述的循环。public class FastSort{
public static void main(String []args){
System.out.println("Hello World");
int[] a = {12,20,5,16,15,1,30,45,23,9};
int start = 0;
int end = a.length-1;
sort(a,start,end);
for(int i = 0; i