简单的选择排序和插入排序算法

选择排序

一种简单直观的排序算法。 

优点:移动数据次数已知(n-1次); 

缺点:比较次数多。

初始数据集的排列顺序对算法的性能无影响。

评价算法的性能主要从两个方面着手:

1、算法的执行时间

2、算法所占用的存储空间

算法性能的主要标准是 算法的时间复杂度。

工作原理:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序是不稳定的排序方法,

比如序列[5(1), 5(2), 3]; 第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面。  

5(1) —> 3 交换 ; 3   5(2)   5(1) 。

算法描述和分析:

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

1、初始状态:无序区为R[1..n],有序区为空;      

2、第i趟排序(i=1,2,3...n-1);

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。       

3、前n-1趟结束,数组有序化了。

算法过程:

举例:数组 int[] arr={5,2,8,4,9,1};

  -------------------------------------------------------

  第一趟排序: 原始数据:5  2  8  4  9  1

  最小数据1,把1放在首位,也就是1和5互换位置,

  排序结果:1  2  8  4  9  5

  ------------------------------------------------------

  第二趟排序:

  第1以外的数据{2  8  4  9  5}进行比较,2最小,

  排序结果:1  2  8  4  9  5

第三趟排序:

除1、2以外的数据{8  4  9  5}进行比较,4最小,8和4交换

排序结果:1  2  4  8  9  5

-------------------------------------------------------

第四趟排序:

除第1、2、4以外的其他数据{8  9  5}进行比较,5最小,8和5交换

排序结果:1  2  4  5  9  8

-------------------------------------------------------

第五趟排序:

除第1、2、4、5以外的其他数据{9  8}进行比较,8最小,8和9交换

排序结果:1  2  4  5  8  9

代码:

int[] a = { 7, 6, 2, 5, 1, 3, 4,10,8,9 }

// 选择排序的优化

for(

int i = 0;i<a.length;i++)

{

//无序区的最小数据数组下标

      int min = i;      

for (int j = i+1; j < a.length; j++) {

if (a[min] > a[j]) {

//记下目前找到的最小值所在的位置

min = j;

         }

}

//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换         

if (min != i) {     //交换a[i]和a[min]

int temp = a[min];

a[min] = a[i];

a[i] = temp;

}

}for(

int i = 0;i<a.length;i++)

{

System.out.println(a[i]);

}

结果:1 2 3 4 5 6 7 8 9 10

 

插入排序

什么是插入排序?

  是一种简单直观的排序算法是基于比较的排序。所谓的基于比较,就是通过比较数组中的元素,看谁大谁小,根据结果来调整元素的位置

原理是什么?

  通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

算法的描述和分析

1、从第一个元素开始,该元素可以认为已经被排序;

2、取出下一个元素,在前面已经排序好的元素序列中从后向前开始比较;

3、如果已排序好的元素>新元素,将新元素移到前一个位置并继续和前一个元素进行比较;

4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

5、将新元素插入到该位置后;

6、重复步骤2~5

        如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数减去(n-1)次。平均来说插入排序算法复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。

过程说明:

假设有一系列数字:[7 2 3 9 6 1] 

先我们考虑数字2。首先我们手里是一张7,随后又抓到了数字2,很显然2<7,所以2放在7前面; 排序后 [2 7 3 9 6 1] 。

随后我们又抓到了数字3,3<7,所以3放在7前面并和2比较,3>2,所以放在2后面;   排序后 [2 3 7 9 6 1] 。

再继续我们抓到了9,9>7所以9的位置不变; 排序后 [2 3 7 9 6 1] 。

然后我们又抓到了一张6,因为6<9,所以放在9前面并和7比较;因为6<7,所以6再前进一步,放到7的前面并和3比较;3<6,所以6放到3的后面; 排序后 [2 3 6 7 9 1] 。

最后,我们抓到了一张1并和9进行比较,1<9,所以放在9前面并和7比较,1<7,放到7前面并和6比较,1<6,放到6前面并和3比较,1<3,把1放到3前面并和2比较,1<2,把1放到2前面,完成排序。得到最后的排列顺序:[1 2 3 6 7 9] 。 

代码:

    public static void main(String[] args) {
        int arr[] = {8,1,5,3,9,4,7,6};
        int temp;
        for (int i = 1; i < arr.length; i++) {
            temp = arr[i];
            int j = i-1;
            while (j>=0 && temp<arr[j]) {
                arr[j+1] = arr[j];
                j--;
            }
            arr[j+1] = temp;
        }
        System.out.println(Arrays.toString(arr));    
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值