算法基础之插入排序,选择排序
2018-01-04 15:14
218 查看
插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
两种排序性能比较:
首先封装一个生成随机数组的函数,再封装一个计算时间的工具类:
运行结果:
插入排序优化
插入排序过程中,需要不断的去交换,耗时较多,而我们进行比较占用的时间很少
以下优化为每次循环只交换一次值。,跟上述插入排序相比性能提高了有一倍
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为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
相关文章推荐
- PHP四种基础算法详解(冒泡排序、选择排序、插入排序、快速排序)
- 数据结构与算法——三种基础排序算法C#实现(冒泡排序、选择排序、插入排序)
- 算法基础:排序(一)——选择排序、插入排序、Shell排序——Python实现
- 算法基础:排序(一)——选择排序、插入排序、Shell排序——Python实现
- 【算法基础】冒泡、选择、插入排序(三种基本排序)
- 算法学习一选择排序和插入排序
- 基础排序算法(冒泡排序、选择排序、插入排序)
- 算法—比较两种排序算法:选择排序和插入排序(详细)
- 基础算法之排序(3)--插入排序
- 排序基础--(插入排序、交换排序、选择排序、归并排序)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- python基础编程_32_插入排序,冒泡排序,选择排序
- 算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
- 算法基础之排序篇-选择排序
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 算法基础:排序之插入排序
- 算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
- 基础排序:冒泡排序、选择排序、插入排序
- 【算法和数据结构】—— 1.选择排序、插入排序