标签:
简单排序
内部排序 和外部排序 内部排序 就是 假如 你有2GB的内存 刚好 有 2GB以下的 数据需要排序 这样刚好就 将全部的数据 储存到 内存当中 进行了排序 这就是内部排序 与之相反的 外部排序就是 你有1TB的 数据需要排序但是 你有 2GB的内存 这时候 内存 不能盛下 数据 就需要 开始外部排序了.
稳定排序 和不稳定排序 任意两个相等的数据 在 排序前后的相对位置不发生变化. (这个 比较容易实现)
没有任何一种 排序在任何情况下 都是 最优的.
所以说 存在 就必定有它存在的必然性 在课本里面的东西 只要有 就应该 好好的学习 .
冒泡排序 .这个就很简单了 大家应该都会 . 直接附上代码
冒泡虽然很垃圾,但是冒泡有两个有点
1: 可以对 链表进行排序(快速排序 好像也可以).
2: 可以手动控制稳定性 (快速排序 好像也可以).
(小问题 如果有7个数字 则最多 需要比较几次? ) -------------21 why? 如何计算?
//核心思想就是 每一次 都找一个最大的 然后以此交换 知道将最大的放到最后面 第二次将第二大的 放到 倒数第二的位置 一次进行 n次 这样的操作.
//稳定性的话 就是看你 需要交换的 条件 如果 不是 大于或等于 或者是 小于或等于 就是稳定的 只要 相等也交换 就是 不稳定的排序.
void Bubble_Sort( ElementType A[], int N ) { for ( P=N-1; P>=0; P-- ) { flag = 0; for( i=0; i<P; i++ ) { /* 泡 一趟冒泡 */ if ( A[i] > A[i+1] ) { Swap(A[i], A[i+1]); flag = 1; /* 换 标识发生了交换 */ } } if ( flag==0 ) break; /* 换 全程无交换 */ } } //最好情况:顺序 T = O( N ) //最坏情况:逆序 T = O( N 2 )
插入排序: 就是咱们 打牌的时候 插牌的思想.
1:程序短 但是插入排序最重要的存在原因就是啥呢? 后面补充
2:插入排序稳定.
时间复杂度下界
对于下标 i<j ,如果A[i]>A[j] , 则称(i,j)是一对逆序对(inversion)
逆序对的计算
问题:序列{34, 8, 64, 51, 32, 21} 中有多少逆序对? 9对
(34, 8) (34, 32) (34, 21) (64, 51) (64, 32) (64, 21) (51, 32) (51, 21) (32, 21)
交换2 个相邻元素正好消去1 个逆序对!
插入排序:T(N, I) = O( N+I )
— 如果序列 基本有序
v
思考!!!!!!!!!!
定理:任意N 个不同元素组成的序列平均具有 N ( N ? ? 1 ) / 4 个逆序对。 ? 定理:任何仅以交换相邻两元素来排序的算 法,其平均时间复杂度为 定理:任何仅以交换相邻两元素来排序的算 法,其平均时间复杂度为 ? ? ( N 2 ) 。 ? 这意味着:要提高算法效率,我们必须 ? 每次消去不止1 个逆序对! ? 每次交换相隔较远的2
标签:
原文地址:http://www.cnblogs.com/A-FM/p/5158047.html