算法学习:直接插入排序:

选择排序算法是一种不太稳定的算法,算法的时间复杂度与元素的其实存放位置有关。

选择排序算法的主要实现过程如下;将要排序的元素中的第一个元素作为哨兵元素,将后边的元素依次与这个哨兵元素比较如果比哨兵元素大则放在哨兵后边(这里是按照从小到大的排序方式选择的)然后依次与哨兵元素的前面元素进行比较,并放在合适的位置;如果比哨兵元素小则放在哨兵元素的前边,然后依次与哨兵元素后边的元素进行比较,放在合适的位置。实现过程如图所示:

 具体实现代码如下:

import java.util.Random;

public class InsertSoftTest {

    public static void main(String[] args) {
//        int[] arr = new int[] { 5, 7, 18, 13, 11, 21, 34, 78 };
//        int[] arr = new int[] { 60,33,74,64,85,82,34,5,13 };
        Random random = new Random();
        int[] arr = new int[]{random.nextInt(100), random.nextInt(100), random.nextInt(100)
                , random.nextInt(100), random.nextInt(100),
                random.nextInt(100), random.nextInt(100), random.nextInt(100)
                , random.nextInt(100)};
        int[] sortArr = new int[arr.length];
        // 将无序数组的第一个元素放入有序数组的第一个元素作为哨兵元素
        sortArr[0] = arr[0];
        // 记录有序数组中元素的个数
        int sortcount = 1;
        // 用于记录第一个值的位置
        int sentry = 0;
        int location;
        for (int i = 1; i < arr.length; i++) {
            // 将每一个值与第一次放入的值比较
            if (arr[i] < sortArr[sentry]) {
                if (sentry==0){
                    sortArr=move(sortArr,sentry,sortcount);
                    sortArr[sentry] = arr[i];
                    sentry++;
                    sortcount++;
                }else {
                    // 从哨兵元素开始向前查找
                    for (location = sentry - 1; location >= 0; location--) {
                        if (sortArr[location] < arr[i]) {


                            break;
                        }
                    }
                    sortArr = move(sortArr, location+1, sortcount);
                    sentry++;
                    sortArr[location+1] = arr[i];
                    sortcount++;
                }

            } else {
//
                for (location = sentry; location < sortcount; location++) {
                    if (sortArr[location] >= arr[i]) {
                        break;
                    }
                }
                sortArr = move(sortArr, location, sortcount);
                sortArr[location] = arr[i];
                sortcount++;
            }


        }
        for (int a = 0; a < sortcount; a++) {
            System.out.print(sortArr[a] + " ");
        }
        System.out.println();

    }

    // 将数组中的元素位置逐位向后移动
    private static int[] move(int[] arr, int index, int sortcount) {
        for (int i = sortcount - 1; i >= index; i--) {
            // 将数组倒数第二位开始逐位向后移动
            arr[i + 1] = arr[i];
        }
        arr[index] = 0;
        return arr;
    }
}

输出排序后的序列如图所示:

 

 

算法总体思想应该没有太大差距,但是实现方法可能不太简练,希望有大佬能指点一下

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值