1,冒泡排序
是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
Java实现代码
private static void bubbleSort(int[] array) {
//冒泡排序
/*
* 稳定: 没有跳跃的比较,所以比较稳定
* 时间复杂度:o(n^2)
*/
// TODO Auto-generated method stub
System.out.println(System.currentTimeMillis());//程序执行的时间
int tmp=0;
for(int i=0;i<array.length;i++){//趟数
for(int j=0;j<array.length-1-i;j++){//比较的次数
if(array[j+1]<array[j]){
tmp=array[j];
array[j]=array[j+1];
array[j+1]=tmp;
}
}
}
System.out.println(System.currentTimeMillis());
}
public static void main(String[] args) {
//冒泡排序
//int[] array={12,43,2,1,54,76};
int[] array=new int[10000];//随机生成一万个数据;
for(int i=0;i<array.length;i++){
array[i]=i;
}
bubbleSort(array);
System.out.println(Arrays.toString(array));
}
但是当一个数组本身就是有序的时候,此时用冒泡排序就会增加很多时间复杂度
所以我们应该对冒泡 排序进行优化。
如果让它进行第一趟比较时并没有进行任何交换,那么就说明这个数组本身就是有序的
public static void newbbsort(int[] array){
System.out.println(System.currentTimeMillis());
int tmp=0;
int k=0;
for(int i=0;i<array.length;i++){//趟数
for(int j=0;j<array.length-1-i;j++){//比较的次数
if(array[j+1]<array[j]){
k++;
tmp=array[j];
array[j]=array[j+1];
array[j+1]=tmp;
}
}
if(i==0&&k==0)
{
break;
}
}
System.out.println(System.currentTimeMillis());
}
这个时候的时间之差为1;
-------------如果用没有优化之前的--------------
时间差就大许多!!!!
2,选择排序
是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
java实现代码
public class Test7 {
public static void main(String[] args) {
int[] array={23,45,2,3,657,8};
selectSort(array);
System.out.println(Arrays.toString(array));
}
public static void selectSort(int[] array){
int min;
int tmp;
for(int i=0;i<array.length;i++){
min=i;
for(int j=i;j<array.length;j++){
if(array[j]<array[min]){
min=j;//选出最小值下标
}
}
/*
* 将第一个元素和最小值交换
*/
tmp=array[i];
array[i]=array[min];
array[min]=tmp;
}
}
}
3,直接插入排序
是一种简单的排序算法,相当于生活中打扑克牌的方式,将一个数插入在一个有序的数列中。插入之后也要保证有序。
java实现代码
public class Test7 {
public static void main(String[] args) {
int[] array={23,45,2,3,657,8};
InsrtSort(array);
System.out.println(Arrays.toString(array));
}
public static void InsrtSort(int[] array){
//不稳定
int temp;
int j;
for(int i=1;i<array.length;i++){
temp = array[i];//从i号位置开始进行排序。
for(j=i-1;j>=0;j--){
if(array[j]>temp){
array[j+1]=array[j];
}else {//每次排序过后前面已经有序,找到第一个比temp小的。
break;
}
}
array[j+1]=temp;
}
}
}