您的位置:首页 > 其它

-----------简单排序-------------

2016-01-25 17:24 204 查看
简单排序

内部排序 和外部排序 内部排序 就是 假如 你有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:插入排序稳定.

#include <stdio.h>
#include<algorithm>
#include <string.h>
using namespace std;
int main()
{
int p,i,j,a[10]={2,5,8,9,6,3,1,4,7,0},temp;
for(p=1;p<10;p++)                             //  从原先的 数组里面  一次选出来一个数字
{
temp=a[p];                             //赋值给 temp
for(i=p;i>0&&a[i-1]>temp;i--)     //开始  倒着检查  并且将 大于该牌的牌一次后移一位 直到  刚才选出来的牌  小于 那一张扑克 .(  手里面扑克总量 是  P)
{
a[i]=a[i-1];
}
a[i]=temp;            //小于了 那么就插入吧  ,刚好刚才还腾出来了 一个 空位.
}
for(i=0;i<10;i++)
printf("%d",a[i]);
}


----------------------排序的 思想是什么?-----------------

时间复杂度下界

对于下标 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)


所以 排序的 的si

交换2 个相邻元素正好消去1 个逆序对! 所以 冒泡 和插入 在这一个 数组里面 都需要交换9次.

插入排序:T(N, I) = O( N+I )
— 如果序列 基本有序

思考!!!!!!!!!!

定理:任意N个不同的元素组成的序列平均具有N(N-1)/4 个 逆序对   (平均哦)
定理:任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为  N^2


---------------------有没有 灵光乍现?------------------------

意思就是 我们想提高算法的效率 我们可以从 每次交换 消去尽可能多的 逆序对.

-----------------------怎么实现呢?---------------------------------

我们可以 交换 相邻较远的 逆序对(注意观察 上面的 9个 逆序对) 这样一次交换就可以消去 多个 逆序对.

--------简单排序到此为止 下面 就去 实现 一次交换 消去 N个 逆序对.-----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: