发表于: 2017-09-23 23:44:52
1 765
一、今天完成的事情
数据结构的基础已经快结束了!!
具体说下,今天的学习内容 主要是排序
1.简单的插入排序
可以把其当作一个抓扑克牌的实例
以下代码是c语言实现, java同样的道理。(没有太多的区别)
void insertion_Sort (ElementType A[] , int a) { //相当于一个接口,a代表数组的长度。 int j,p; ElementType Tmp; for(p = 1 ; p < a ; p++ ) {//假设第一张牌已经再手上了,从第二张牌开始拿,拿到a-1 tmp = A[p];//将牌拿在手里 for(j = p ; j > 0 && tmp < A[j-1] ;j--) { A[j] = A[j-1];//如果小就将元素往后移, } A[j] = tmp;//移完后,插到当前位置。 }}
平均时间复杂度:O(N平方)
属于:稳定的排序
为什么插入排序会比较慢?因为只在相邻的元素互换,每次仅消除一个逆序对,所以要想更快速的排序,就必须一次不止消除一个逆序对。
2.希尔排序
基于插入排序的思想,只是互换的元素,要远一些,这样才有可能,一次消除不止一个逆序对
思想:对于hk , hk+1 ,... , N-1中的每一个位置i,把其上的元素放到i,i-hk,i-2hk,...,中间的正确位置上
这就需要选择增量序列:以下使用shell序列(不是最好的)
代码如下:
void shell_Sort(ElementType A[] , int N) { int i , j ,increment; ElementType Tmp; for(increment = N ; increment > 0; increment /= 2) {//Shell的增量序列定义 for(i = increment ; i < N; i++) {//从increment(n/2)开始拿牌 Tmp = A[i]; //将第i+1张牌,拿到手上, for(j = i ; j > 0 && Tmp < A[j - increment];j--) { A[j] = A[j-increment]; } A[j] = Tmp; } } }
但是这的最坏时间复杂度仍然是θ(N的平方),原因就在于选取的增长序列不互质,,,,
所以这个方法并不是最好的,所以增长序列的选择很重要。
这里不再说明。
4.冒泡排序
形如冒泡的排序方法:循环N-1趟,每一趟大最下泡放在下面。
void bubble_Sort (ElementType A[] , int N) { int i , j ; bool flag; for(i = N-1; i>= 0;i-- ) { flag = 0;//一个小套路!!嘿嘿嘿,我偏不说! for (j = 0; j < i ; j++ ) { if(A[j] > A[j+1]) { swap(A[j] , A[j+1]); flag = 1; } } if(flag == 0 ) { break; } } }
最好情况是O(N)
最坏情况是O(N2) 完全逆序的。
好处就是 非常简单!!!冒泡排序是可以排序链表的。稳定!!
二、明天要完成的事情
明天结束这个了 哈哈
三、问题
好几天没有写日报了,首先要悔改!!!没有借口 ,其实就是自己懒了,,,下次 不能这样了!!
四、收获
学到了很多,等到学完这个,再刷任务???还得再想想。
评论