数据结构(一)

1.冒泡排序:

用自己的话讲一下冒泡排序的过程:

事例:有一个数组 [6,10,5,8,4,3],对该数组进行冒泡排序,设计两层循环,第一层循环,用来遍历总循环的次数,第二层循环用来扫描各个元素的值

第一步:从第一个位置开始(指针直线6这个值),跟后一个位置(也就是第二个)的值比较,如果第二个值小于第一个值时,交换位置,并把指针+1,指向下一个位置。

    第一步结束后,数组为 [6,10,5,8,4,3]

第二步:当前指针在第二位,也就是值为10的位置,5<10,所以交换位置,数组变为[6,5,10,8,4,3],交换值后,指针+1

第三步:当前指针在第三位,也就是值为8的位置,8<10, 所以交换位置,数组变为[6,5,8,10,4,3],交换值后,指针+1

第四步:当前指针在第四位,也就是值为4的位置,4<10, 所以交换位置,数组变为[6,5,8,4,10,3],交换值后,指针+1

第五步:当前指针在第五位,也就是值为3的位置,3<10, 所以交换位置,数组变为[6,5,8,4,3,10],此时指针到达最后一个位置了,跳出第二层循环,将外层循环的指针加一

 代码:

  public static int[] bubbleSort(int[] arr){
        for(int i = 0;i<arr.length-1;i++){
            for (int j = 0;j<arr.length-1;j++){
                if(arr[j]>arr[j+1]){
                    //如果后面的值小于前面的值,就进行交换
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

  冒泡排序:最好的与最坏的情况下,遍历次数都一样,都是O(n^2)

2.插入排序:

用自己的话讲一下插入排序的过程:

事例:有一个数组 [6,10,5,8,4,3],对该数组进行插入排序:

第一步:从第二个位置开始(指针直线10这个值),跟前一个位置(也就是第一个)的值比较,如果第二个值小于第一个值时,交换位置,并把指针+1,指向下一个位置。

    第一步结束后,数组为 [6,10,5,8,4,3]

第二步:当前指针在第三位,也就是值为5的位置,5<10,所以交换位置,数组变为[6,5,10,8,4,3],交换值后,前面有值,再跟前面的值对比,5<6,交换位置,数组变为[5,6,10,8,4,3],指针+1

第三步:当前指针在第四位,也就是值为8的位置,8<10,所以交换位置,数组变为[5,6,8,10,4,3],交换值后,前面有值,再跟前面的值对比,8>6,无需交换位置,指针+1

第四步:当前指针在第五位,也就是值为4的位置,4<10,所以交换位置,数组变为[5,6,8,4,10,3],交换值后,前面有值,再跟前面的值对比,4<8,交换位置,数组变为[5,6,4,8,10,3],

    交换值后,前面有值,再跟前面的值对比,4<6,交换位置,数组变为[5,4,6,8,10,3],交换值后,前面有值,再跟前面的值对比,4<5,交换位置,数组变为[4,5,6,8,10,3],指针+1

第五步:当前指针在第六位,也就是值为3的位置,3<10,交换位置,数组变为[4,5,6,8,3,10],交换值后,前面有值,再跟前面的值对比,3<8,交换位置,数组变为[4,5,6,3,8,10],

    前面有值,再跟前面的值对比,3<6,[4,5,3,6,8,10],前面有值,再跟前面的值对比,3<5,[4,3,5,6,8,10],前面有值,再跟前面的值对比,3<4,[3,4,5,6,8,10],此时指针已经是最大了,推出循环,

    得到的就是插入排序后的数组[3,4,5,6,8,10]。

编写插入排序代码:

public class insertSort {

    public static int[] insertSortMethod(int[] arr){
        //首先遍历数组,从第二位开始
        for(int i = 1;i<arr.length;i++){
            //再遍历一下数组,让指针在的值与数组前面的值依次对比
            for(int j = i;j>0;j--){
                if(arr[j]<arr[j-1]){
                    //如果后面的值小于前面的值,就进行交换
                    int temp = arr[j-1];
                    arr[j-1] = arr[j];
                    arr[j] = temp;
                }else{
                    break;
                }
            }
        }

        return arr;
    }


    public static void main(String[] args) {
        System.out.println("aaa");
        int[] arr = {6,10,5,8,4,3};
        int[] ints = insertSortMethod(arr);
        for (int i:
                ints) {
            System.out.print(i+",");

        }
    }
}

  

插入排序的平均时间复杂度也是 O(n^2),空间复杂度为常数阶 O(1),具体时间复杂度和数组的有序性也是有关联的。

插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。

最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)。

3.

原文地址:https://www.cnblogs.com/takeyblogs/p/13932843.html