10-排序-02-快速排序法

来源:互联网 发布:怎么加盟淘宝实体店 编辑:程序博客网 时间:2024/06/16 00:03

1冒泡排序

基本思想:

冒泡法也称沉底法,每相邻两个记录关键字比大小,大的记录往下沉(即较小的往上浮)。每一趟把最后一个下沉的位置记下,下一趟只需检查比较到此为止;到所有记录都不发生下沉时,整个过程结束。

排序过程:

   将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与第三个记录;依次类推,直至用n-1次比较完成 n个记录的第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上。

   对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置。

   重复上述过程,直到“在一趟排序过程中没有可进行记录交换的操作”为止。



算法


void Bubblesort(){ for(i=1;i<L;i++)    for(j=1;j<=L-i;j++)       if ( R[j].key>R[j+1].key )            // 大则交换           { R[0].key=R[j].key;              R[j].key=R[j+1].key;              R[j+1].key=R[0].key;           } }


效率分析:

空间效率:仅用了一个辅助单元,空间复杂度为O(1)。


时间效率:总共要进行n-1趟冒泡,对j个记录的表进行一趟冒泡需要j-1次关键字的比较。
移动次数:
最好情况下:待排序列已有序,不需移动。
最坏情况下:每次比较后均要进行三次移动。

移动次数=

时间复杂度为: O(n2)
冒泡排序是一种稳定排序。

2.快速排序

基本思想:

就排序时间而言,快速排序被认为是一种最好的内部排序方法。
通过一趟快速排序将待排序的记录分割成独立的两部分,其中前一部分记录的关键字均比枢轴记录的关键字小;后一部分记录的关键字均比枢轴记录的关键字大,枢轴记录得到了它在整个序列中的最终位置并被存放好,这个过程称为一趟快速排序。
第二趟再分别对分割成两部分子序列,再进行快速排序,这两部分子序列中的枢轴记录也得到了最终在序列中的位置而被存放好,并且它们又分别分割出独立的两个子序列……。显然,这是一个递归的过程,不断进行下去,直到每个待排序的子序列中只有一个记录时为止,整个排序过程结束。
快速排序是对冒泡排序的一种改进。
如何把一个记录组分成两个部分?通常是以序列中第一个记录的关键字值作为枢轴记录。

排序过程:

   对r[s……t]中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=r[s],x=rp.key

 初始时令i=s,j=t

   首先从 j 所指位置向前搜索第一个关键字小于x 的记录,并和 rp 交换;

   再从 i 所指位置起向后搜索,找到第一个关键字大于x 的记录,和 rp 交换;

   重复上述两步,直至i==j为止

   再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止。


算法:

int Partition(int i,int j) //i、j为形参,分别代表low和high{ RecType pivot=R[i]; while(i<j)                // 从表的两端交替地向中间扫描 { while(i<j&&R[j].key>=pivot.key)         j- -;   if (i<j) R[i++]=R[j];   while (i<j&&R[i].key<=pivot.key)   i+ +;   if (i<j)   R[j- -]=R[i];   }    R[i]=pivot; return i;} void QuickSort(int low,int high)   // 递归形式的快排序{ int pivotpos,k;  if (low<high)    { pivotpos=Partition(low,high);                           //调用Partition(low,high)函数      QuickSort(low,pivotpos-1);  // 对低子表递归排序      QuickSort(pivotpos+1,high); // 对高子表递归排序     } }

算法评价

时间复杂度

  最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n)—经验证明快速排序为同数量级下平均性能最好的。

 

  最坏情况(每次总是选到最小或最大元素作枢轴)--退化为冒泡排序T(n)=O(n²)

空间复杂度:需栈空间以实现递归

最坏情况:S(n)=O(n)

一般情况:S(n)=O(log2n)

快速排序为不稳定排序。



0 0