rust 实现插入排序

一,插入排序


            插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。
      插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。

         在插入排序中,需要将取出的数据与其左边的数字进行比较。就跟前面讲的步骤一 样,如果左边的数字更小,就不需要继续比较,本轮操作到此结束,自然也不需要交换 数字的位置。
然而,如果取出的数字比左边已归位的数字都要小,就必须不停地比较大小,交换 数字,直到它到达整个序列的最左边为止。具体来说,就是第 k 轮需要比较 k - 1 次。
因 此,在最糟糕的情况下,输入数据按从大到小的顺序排列时,第 2 轮需要操作 1 次,第 3 轮操作 2 次……第 n 轮操作 n - 1 次,所以时间复杂度和冒泡排序的一样,都为 O( n2 )

二,代码实现

///插入排序
///插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。
///插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。
fn insert_sort<T: PartialOrd + Copy>(list: &mut Vec<T>) -> &Vec<T> {
    let mut chang_index = 0;
    let mut element = list[chang_index];
    for i in 0..list.len() {
        if let Some(elem) = list.get(i) {
            if element > *elem {
                list.swap(i, chang_index); //交换归位
                chang_index = i;
                //检查已归位的数据
                bubble_sort_len(list, chang_index);
            } else {
                element = *elem; //切换边界
                chang_index = i;
            }
        }
    }
    list
}

///选择长度,冒泡
fn bubble_sort_len<T: PartialOrd + Copy>(list: &mut Vec<T>, len: usize) -> &Vec<T> {
    for i in 0..len {
        for x in 0..len - 1 {
            if list[x] > list[x + 1] {
                list.swap(x, x + 1);
            }
        }
    }
    list
}

三,效果展示

fn  main { 
    let mut list = vec![5, 3, 4, 7, 2, 8];
    insert_sort(&mut list);
    println!("{:?}  ", list); 

}
console:

[2, 3, 4, 5, 7, 8]

四,过程演变

外层循环  [3, 5, 4, 7, 2, 8]
外层循环  [3, 4, 5, 7, 2, 8]
外层循环  [3, 4, 5, 2, 7, 8]
内层循环  [3, 4, 2, 5, 7, 8]
内层循环  [3, 2, 4, 5, 7, 8]
内层循环  [2, 3, 4, 5, 7, 8]

猜你喜欢

转载自blog.csdn.net/qq_39308071/article/details/114263417