冒泡排序与选择排序

2018-11-28  本文已影响0人  仲达_dc6c

今天开始,我就把自己学习的过程记录下来,避免自己学了之后就忘记了,让自己能够坚持下去,希望会有所收获。

数据结构,包含两个方面:

逻辑结构:集合结构,线性结构,树形结构,图标结构。

存储结构:表,堆栈,队列,数组,树,二叉树,图。二叉树和图我还不知道怎么回事,以后学了在总结。

我好像总结完事了,但是好像什么也没说似的,看来要经常写才行,语言组织的不好。

算法

要完成一个功能,你是怎么做到的,你的思路就是算法。

衡量的几个标准

空间复杂度:代码行数

时间复杂度:排序的个数n,以及for循环,数据交换。执行的效率

O(n):

O(n)=n²+n+100 =>n²

O(n)=n³+n²+n=>n³

应用场景:这个也是比较重要的,比方说10个整数的数组使用Arrays.sort(array)进行排序,就不太妥当,里面实现的空间复杂度太大,100多行的代码,就排序10个数这不一定是最好的。应该使用冒泡或者是选择排序。

冒泡排序

思想:1.如同烧开水,水泡向上咕噜咕噜越来越大。每次比较相邻的两个数据,将大的向后靠。

代码如下:

for(int I = 0;i<array.length-1;i++){

    if (array[i] > array[i+ 1]) {

        swap(I,i+1);    

    }

}

2.这样循环一次之后,最大的数就到了数组的最后了。

将这样的操作执行array.length-1次,就冒泡结束了。

for(int j=array.length-1;j>0;j--){

    for(int I = 0;i<j;i++){

        if (array[i] > array[i+ 1]) {

            swap(I,i+1);

    }

}

}

时间复杂度:第一次需要n-1个数比较,第二次需要n-2次比较,最后两个数比较1次就好了

O(n)=(n-1)+(n-2)+....+1=((n-1)+1)*(n-1)/2=n*(n-1)/2

这样冒泡就OK了,也是可以做个优化的,可以在if里面做判断,如果没有可以交换的数据,可以提前退出外层for循环。

选择排序

思路:

1.第一个数作为参考点,假设是最小的数据。在剩下的数据中遍历出来最小的数据,如果比第一个还小,那就和第一个数据进行交换位置。

int index = 0;//参考点

for(int I=index + 1;i<array.length-1;i++){

    if(array[I]<array[index]){

        index = I;

    }

}

swap(index,0);

这样,经过一次的选择排序,就会有一个最小的数据被选出来,放到了参考点的问题位置。

2.将参考点向后移动,在进行array.length-1次选择。

for(int j = 0; j < array.length-1;j++){

    int index = j;

    for(int I=index + 1;i<array.length-1;i++){

        if(array[I]<array[index]){

            index = I;

        }

    }

    swap(index,j);//j 是参考点,index是遍历出来后的最小的元素,将他们互换。

}

时间复杂度:

第一个参考点需要比对n-1次,第二个参考点需要比对n-2次,......比对1次

O(n)=(n-1)+(n-2)+....+1=((n-1)+1)*(n-1)/2=n*(n-1)/2

冒泡和选择的区别:

冒泡:相邻的两个数据交换的次数比较频繁,但是可以提前退出外循环。

选择:比较两个两个数的大小次数多,但是数据交换的次数少,最坏的情况是要进行n-1次交换。

这两种排序通常使用在10个数据以内的排序,性能没什么差异。但是数据量超过10个,考虑其他排序方式。

冒泡选择排序代码

上一篇下一篇

猜你喜欢

热点阅读