您的位置:首页 > 其它

算法基础之插入排序,选择排序

2018-01-04 15:14 218 查看
插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

public static void insertSort(int arr[],int n){

int temp;

for(int i = 1; i < n; i++){

int curValue = arr[i];

for(int j=i;j>0;j--){

if(arr[j] < arr[j-1] ){

temp=arr[j-1];

arr[j-1]=arr[j];

arr[j]=temp;

}

};

};
};


选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

public static void selectSort(int arr[],int n){

int tem;

for (int i = 0; i < n; i++) {

//当前索引设最小索引
int minIndex = i;

for(int j=i+1;j<n;j++){
//当前值小于最小值,替换最小值所在的索引
ad28
位置;
if(arr[j]<arr[minIndex]){
//记录最小索引
minIndex=j;
}
}

//最小索引所在值得,与当前值交换值
tem = arr[minIndex];

arr[minIndex]=arr[i];

arr[i]=tem;

}

};


两种排序性能比较:

首先封装一个生成随机数组的函数,再封装一个计算时间的工具类:

//creat random array.
public static int[] getrandomarray(int log){
int[] result = new int[log];
for (int i = 0; i < log; i++) {
result[i] = i;
}
for (int i = 0; i < log; i++) {
int random = (int) (log * Math.random());
int temp = result[i];
result[i] = result[random];
result[random] = temp;
}
return result;
}

// time be used
static void useTime(String className,String methodName,int[] arr,int num) throws Exception{

Class<?> forName = Class.forName(className);

Method method = forName.getMethod(methodName, new Class[]{int[].class,int.class});

long starTime=System.currentTimeMillis();

method.invoke(forName,arr ,num);

long endTime=System.currentTimeMillis();

System.out.println(methodName+"运行时间:"+(endTime-starTime));

};


运行结果:

insertSort运行时间:64
selectSort运行时间:34


插入排序优化

插入排序过程中,需要不断的去交换,耗时较多,而我们进行比较占用的时间很少

以下优化为每次循环只交换一次值。,跟上述插入排序相比性能提高了有一倍

public static void optimizationInsertSort(int arr[],int n){

for(int i = 1; i < n; i++){

int curValue = arr[i];

int j;

/* for(j=i;j>0;j--){

if(arr[j-1] >curValue){

arr[j] = arr[j-1];
}

}*/

for (j = i; j > 0 && arr[j - 1] > curValue; j--) {
arr[j] = arr[j - 1];
}

arr[j]=curValue;

};
};


运行结果:
optimizationInsertSort运行时间:35
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐