世界微尘里,吾宁爱与憎
排序算法
排序算法

排序算法

十种常见排序算法可以分为两大类:

  • 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
  • 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
img

冒泡排序

基本思路

两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止

算法描述

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。

实现代码:

#include <stdio.h>
void BubbleSort(int *t)//冒泡排序
{
   int i,j;//两个变量,一个用于外层循环,一个用于内层循环
int flag =1;//冒泡排序的改进
   for(i=0;i<9&&flag;i++)//循环次数比数组大小少1
  {
flag=0;
       for(j=9;j>i;j--)//从结尾处向前开始循环,i次循环后前i位便不用进行比较
      {
           if(t[j-1]>t[j])//前者大于后者则交换
          {
               int x;
               x=t[j];
               t[j]=t[j-1];
               t[j-1]=x;
flag=1;
          }
      }
  }

}

分析

时间复杂度,最坏O(n^2),最好O(n),稳定的

快速排序

基本思路

通过一趟排序将待排记录分别分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分进行记录继续进行排序,以达到整个序列有序的目的

算法描述

快速排序使用分治法来把一个串分为两个子串。

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

快速排序的优化

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注