4.冒泡排序:
是一种简单的稳定的交换排序,其排序过程为:对于相邻的元素进行大小比较,如果满足排序要求,则不进行交换,否则将两个数进行交换。
如序列{30, 12, 52, 23, 15, 65, 31, 58, 20,63}:
以下是第一趟:30跟12比较,30>12交换位置,30<52,不交换位置,以此类推,将序列中最大的数放到最后位置,共执行n - 1次比较。共需要做 n - 1 次起泡。
最好时间复杂度:o(n);原因:若文件是正序的时候,只需要一趟冒泡,n - 1次比较,移动次数为0就可以完成排序。因此最好的时间复杂度为o(n);
最坏时间复杂度:o(n^2);原因:若文件是反序的时候,需要n - 1 趟冒泡,每趟比较 n - i 次关键字;比较的最大值为n*(n-1)/2=o(n^2),移动次数最大值为3n(n-1)/2=o(n^2)(注:需要交换的次数为n*(n-1)/2,而每次交换都需要有三条命令:temp = a;a = b;b = temp,这样就要乘以3啦);所以最坏时间复杂度为o(n^2)。
5.快速排序:不稳定排序
例:{49.38.65.97.76.13.27}
首先以49为标准,将序列分为两部分,左边部分比49小..右边部分比49大,这一步如下图:
图来源于:http://www.bsgz.net/Article/Class20/Class88/sjjg/200609/936.html
最坏时间复杂度:o(n^2);原因:当每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,那么必须做n - 1次划分,第 i 次划分开始时区间长度为 n - i +1,所需的比较次数为 n - i,故总的比较次数达到最大值 n*(n-1)/2=o(n^2),由于移动次数不大于比较次数,所以最坏时间复杂度为o(n^2)。
最好时间复杂度:o(nlog2n);原因:当每次划分选取的基准都是中值时,可以用递归树来解释,树的高度 d 与节点数 n 的关系是:
d^2-1 = n;所以递归树高度 d = log2(n+1)=o(log2n) ,而每一层递归子节点中的时间复杂度为 o(n)(注:需要比较的总次数小于 n 次,移动次数比比较次数少);所以通过:每一层递归子节点中的时间复杂度*递归树高度 求出总的时间复杂度:o(nlog2n)
6.归并排序:稳定排序
将两个或两个以上的有序子表合并成一个新的有序表。
例:{72.28.51.17.96.62.87.33}
- {28.72}{17.51}{62.96}{33.87}
- {17.28.51.72}{33.62.87.96}
- {17.28.33.51.62.72.87.96}
最坏时间复杂度:o(nlog2n);
最好时间复杂度:o(nlog2n);都需要log2n趟二路并归,每趟归并的时间为o(n)所以时间复杂度都为o(nlog2n)。