标签:
1冒泡排序
传统冒泡排序
public static void bubble(int[] arr){ int temp; for(int i=arr.length-1;i>0;i--){ for(int j=0;j<i;j++){ if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } }
时间复杂度O(n^2),只需一个额外空间O(1),稳定
传统冒泡排序有一个缺点,不管数据是否已经排序完成都会固定执行n(n-1)/2次,
我们可以在程序中加入判断来判断何时可以提前中断程序,提高效率
public static void bubble(int[] arr){ int temp; for(int i=arr.length-1;i>0;i--){ int flag=0; //flag用来判断是否有执行交换的动作 for(int j=0;j<i;j++){ if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; flag++; //如果有交换,flag不为0 } } if(flag==0){ break; } //当一次扫描判断后flag==0,没有交换动作,说明以完成排序,所以直接跳出循环 } }
2选择排序法
时间复杂度O(n^2),只需一个额外空间O(1),不稳定
public static void select(int[] arr){ int tmp; for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++) { if(arr[j]<arr[i]){ tmp=arr[j]; arr[j]= arr[i]; arr[i]=tmp; } } } }
3插入排序
时间复杂度O(n),只需一个额外空间O(1),稳定,会造成数据的大量搬移,建议在链表上使用
public static void insert(int[] arr){ int i,j; for(i=1;i<arr.length;i++) { int tmp=arr[i]; for(j=i-1;j>=0&&tmp<arr[j];j--){ arr[j+1]=arr[j]; } arr[j+1]=tmp; } }
4希尔排序
标签:
原文地址:http://www.cnblogs.com/xurui1995/p/5233856.html