概念整理01排序算法

1.冒泡排序

一种交换排序;基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

平均时间复杂度O(n*n);最好O(n);最坏O(n*n)

void BubbleSort (SqList *L)                   %较小的数字如同气泡般慢慢浮到上面

{

      int i,j;

      for (i=1;ilength;i++)

     {

          for(j=L->length-1;j>=i;j--)

         {   

             if (L->r[j]>L->r[j+1])

                {

                swap(L,j,j+1);

                }

         }   

    }   

}

 

2.简单选择排序

通过 n-i 次关键字间的比较,从 n-i+1 个记录中选出关键字最小的记录,并和第 i (1≤i≤n) 个记录交换。

最好、最坏、平均时间复杂度O(n*n)

3.直接插入排序

将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

平均时间复杂度O(n*n);最好O(n);最坏O(n*n)

4.堆排序

堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

堆排序(假设利用大顶堆)的基本思想:将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n-1 个序列重新构造成一个堆,这样就会得到 n 个元素中的次大值。如此反复执行,便能得到一个有序序列了。

堆排序的最好、最坏和平均时间复杂度均为O(nlogn);不适合带排序序列个数较少的情况

5.希尔排序

6.归并排序

假设初始序列含有n个记录,则可以看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到【n/2】个长度为2或1的有序子序列;再两两归并,......,如此反复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

最好、最坏、平均时间复杂度O(nlogn)

7.快速排序

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

最好、平均O(nlogn);最坏O(n^2)

 

 

 

你可能感兴趣的:(概念整理01排序算法)