8种排序算法 下载本文

内容发布更新时间 : 2024/12/27 6:08:03星期一 下面是文章的全部内容请认真阅读。

概述

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

我们这里说说八大排序就是内部排序。

当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;

1. 快速排序

交换排序—快速排序(Quick Sort)

介绍:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

2

基本思想:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,

2)通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。 3)此时基准元素在其排好序后的正确位置

4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。 快速排序的示例:

(a)一趟排序的过程:

(b)排序的全过程

/**********快速排序算法*****************/ void QuickSort(int s[], int low, int high) { } /*交换数组中的两个元素*/ void swap(int s[], int i, int j) { } int temp; temp = s[i]; s[i] = s[j]; s[j] = temp; } swap(s, last, low);//基准元与界限交换,这样的话,基准元两边就是一边大于,一边小于; QuickSort(s, low, last - 1); //对左区间递归排序 QuickSort(s, last + 1, high);//对右区间递归排序 int i; int last; //记录基准的位置 if (low < high) //当数组中的元素个数大于1时,才进行操作 { last = low; //选取第一个元素作为基准 //把小于基准元与大于基准元的分开,last记录它们分开的界限 for (i = low + 1; i <= high; i++) { } if (s[i] < s[low]) swap(s, ++last, i);

分析:

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取基准记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。