`

几种排序算法介绍与性能分析

    博客分类:
  • JAVA
 
阅读更多

本文以对整形数组升序排序为例,列举了排序的几种算法及相应的Java实现,并在本文最后给出这几种算法的性能分析图表。

 

1、插入排序 

基本思路:在每次循环中把一个元素插入到已经排序的部分序列里的合适位置,使得到的序列仍然是有序的。

实现:

void sort(int a[]) throws Exception {

int tmp;

      int j;

for (int i = 1; i <= a.length; i++) {

           tmp = a;

           for (j = i - 1; j >= 0 && a[j] > tmp; j--) {

            a[j + 1] = a[j];

           }

           a[j + 1] = tmp;

         }

}

 

2、希尔排序 

基本思路:任取一个小于n的整数S1作为增量,把所有元素分成S1个组。所有间距为S1的元素放在同一个组中。

第一组:{A[1]A[S1+1]A[2*S1+1],……}

第二组:{A[2]A[S1+2]A[2*S1+2],……}

第三组:{A[3]A[S1+3]A[2*S1+3],……}

……

s1组:{A[S1]A[2*S1]A[3*S1],……}

先在各组内进行直接插人排序;然后,取第二个增量S2<S1)重复上述的分组和排序,直至所取的增量St=1St<St-1<St-2<<S2<S1),即所有记录放在同一组中进行直接插入排序为止。

实现:

void sort(int a[]) throws Exception {

int h[] = { 109, 41, 19, 5, 1 };

int tmp, j;

int incno;

for (tmp = 0; h[tmp] > a.length; tmp++);

for (incno = tmp; incno <= h.length - 1; incno++) {

    for (int i = h[incno]; i <= a.length - 1; i++) {

        tmp = a;

        for (j = i - h[incno]; j >= 0 && a[j] > tmp; j = j - h[incno]) {

            a[j + h[incno]] = a[j];

        }

        a[j + h[incno]] = tmp;

}

}

}

 

3、冒泡排序 

基本思路:两两比较待排序的数据,发现两个数据的次序相反则进行交换,直到没有反序的数据为止。

实现:

void sort(int a[]) throws Exception {

for (int i = a.length; --i >= 0;){

    for (int j = 0; j < i; j++) {              

       if (a[j] > a[j + 1]) {

          int T = a[j];

          a[j] = a[j + 1];

          a[j + 1] = T;

        }              

    }

}

}

 

4、选择排序

基本思路:从最后一个元素开始,从待排序的数据中选出记录最大元素位置,在将该元素同未排好顺序数列的最后一个元素交换位置,循环这个操作,直到全部数据排序完毕。

实现:

void sort(int a[]) throws Exception {

for (int i = a.length; --i >= 0;){

   int largest=0;  

   for (int j = 1; j <= i; j++) {

      if (a[largest] < a[j]) {

          largest = j;

      }

    }

    if (largest != i) {

      int T = a[largest];

      a[largest] = a;

      a = T;

    }

}

}

 

5、快速排序

基本思路:在A[1..n]中任取一个数据元素作为比较的“基准”(不妨记为X),将数据区划分为左右两个部分:A[1..i-1]A[i+1..n],且A[1..i-1]XA[i+1..n](1in),当A[1..i-1]A[i+1..n]非空时,分别对它们进行上述的划分过程,直至所有数据元素均已排序为止。这个“基准”本实现采用数列中值

实现:

void quickSort(int a[], int low, int hig) throws Exception

{

int lo = low;

int hi = hig;

int mid;

if ( hig > low)

{

mid = a[ ( log + hiw ) / 2 ];

    while( lo <= hi )

    {

        while( ( lo < hig ) && ( a[lo] < mid ) )

            ++lo;

        while( ( hi > low ) && ( a[hi] > mid ) )

            --hi;

        if( lo <= hi )

        {

            swap(a, lo, hi);

            ++lo;

            --hi;

        }

    }        

    if( low < hi )

        quickSort( a, low, hi );        

    if( lo < hig )

        quickSort( a, lo, hiw );

}

}

 

private void swap(int a[], int i, int j)

{

int T;

T = a;

a = a[j];

a[j] = T;

}

 

public void sort(int a[]) throws Exception

{

quickSort(a, 0, a.length - 1);

}

   

6、堆排序

基本思路:堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。

实现:

void sort(int a[]) throws Exception {

int i;

for (i = a.length / 2; i >= 0; i--) {

    perc_down(i, a, a.length - 1);

}      

for (i = a.length - 1; i >= 0; i--) {

    delete_max(i, a);

}

}

 

void delete_max(int ix, int a[]) throws Exception {

int ret;

ret = a[0];

a[0] = a[ix];

perc_down(0, a, ix - 1);

a[ix] = ret;

}

 

void perc_down(int ix, int a[], int lng) throws Exception {

int i, tmp;

tmp = a[ix];

i = ix;

while (i * 2 + 1 <= lng) {

    if (i * 2 + 1 == lng || a[i * 2 + 1] > a[i * 2 + 2]) {

        if (a[i * 2 + 1] < tmp)

            break;

        a = a[i * 2 + 1];

        i = i * 2 + 1;

    } else {

        if (a[i * 2 + 2] < tmp)

            break;

        a = a[i * 2 + 2];

        i = i * 2 + 2;

    }

}

a = tmp;

}

 

7、归并排序

基本思路:设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m]A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]

为了减少数据移动次数,不妨采用一个临时工作数组C,将中间排序结果暂时保存在C数组中,等归并结束后,再将C数组值复制给A

实现:

void sort(int a[]) throws Exception {

mergesort(a, 0, a.length - 1);     

}

 

private void merge(int a[], int begin, int m, int end) throws Exception {

int i = begin, j = m + 1, k = 0;

int[] tmp = new int[end - begin + 1];

while (i <= m && j <= end) {           

    if (a > a[j]) {

        tmp[k++] = a[j++];

    } else {

        tmp[k++] = a[i++];

    }

}

if (i == m + 1) {

    for (; j <= end; j++) {            

        tmp[k++] = a[j];

    }

} else {

    for (; i <= m; i++) {              

        tmp[k++] = a;

    }

}

for (k = 0; k < tmp.length; k++) {

    a[begin + k] = tmp[k];

}

}

 

private void mergesort(int a[], int begin, int end) throws Exception {

if (end - begin > 0) {

    int m = (end - begin) / 2;

    mergesort(a, begin, begin + m);

    mergesort(a, begin + m + 1, end);

    merge(a, begin, begin + m, end);

}

}

 

 

性能比较

 

 

时间复杂度

空间复杂度

稳定

1

插入排序

O(n2)

1

2

希尔排序

O(n2)

1

×

3

冒泡排序

O(n2)

1

4

选择排序

O(n2)

1

×

5

快速排序

O(Nlogn)

O(logn)

×

6

堆排序

O(Nlogn)

1

×

7

归并排序

O(Nlogn)

O(n)

分享到:
评论

相关推荐

    算法设计与分析-1排序算法性能分析-冒泡/选择/插入/合并/快速排序-pre ppt

    排序算法性能分析 选择排序 冒泡排序 插入排序 合并排序 快速排序算法原理及代码实现 不同排序算法时间效率的经验分析方法 验证理论分析与经验分析的一致性 当面临巨大数据量的排序的时候,还是优先选择合并排序算法...

    内部排序算法的性能分析

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。

    几种排序算法的平均性能比较(实验报告).pdf

    几种排序算法的平均性能比较(实验报告).pdf几种排序算法的平均性能比较(实验报告).pdf几种排序算法的平均性能比较(实验报告).pdf几种排序算法的平均性能比较(实验报告).pdf几种排序算法的平均性能比较(实验报告).pdf...

    各种排序方法分析详解

    几种排序算法介绍与性能分析 插入排序 希尔排序 冒泡排序 选择排序 快速排序

    各种排序算法性能的比较

    用于比较几种排序算法的性能。不过程序中有几个小错误,要加几个系统头文件和两个比较大小的函数

    java 内部排序算法的性能分析

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 [需求分析] (1)对起泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法进行比较; (2)待排序表的表长不小于100...

    数据结构-排序算法性能分析

    设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 【基本要求】 (1)实现各种内部排序。包括冒泡排序,直接选择排序,希尔排序,快速排序,堆排序。 (2) 待排序的元素的关键字为整数...

    几种常见的排序算法的实现与性能分析数据结构课程设计报告.doc

    几种常见的排序算法的实现与性能分析数据结构课程设计报告.doc

    排序算法 各种算法的综合

    另外还有几种 算法因为涉及树与堆的概念,所以这里不于讨论。 第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较 奇特,值得参考(编程的角度)。同时也可以让我们从另外的...

    C语言---内部排序算法的性能分析.zip

    (2)需要实现起泡排序(Bubble)、直接插入排序(Insert)、简单选择排序(Select)、快速排序(Quick)、希尔排序(Shell)、堆排序(Heap)几种基本排序算法。 (3)需要实现数据的插入操作,将五组数据存入...

    JAVA关于几种排序算法的性能比较.pdf

    JAVA关于几种排序算法的性能比较.pdf

    C语言几种排序算法的实现

    对直接插入排序、希尔排序、冒泡排序、快排、简单选择排序、堆排序的性能进行分析:比较各种排序算法在不同测试数据情况下的比较次数、移动次数。

    实验二:几种排序算法的实验性能比较1

    1. 几种排序的实现 1. 按照题目要求,设计题目要求的插入排序(Insertion Sort,IS),自顶向下归并排序(Top-down 2. 编写 gene

    数据结构之排序算法性能分析比较

    几种排序算法的比较 包括插入排序,选择排序,冒泡排序,基数排序,快速排序,shell排序等

    数据结构课程设计--排序算法性能分析

    这几种排序算法是在顺序存储结构上实现的,因此在排序过程中需要进行大量记录的移动。当记录很大时,时间耗费很大,此时可采用静态链表作存储结构。但是有的排序方法,无法实现表排序。在这种情况下可以进行地址...

Global site tag (gtag.js) - Google Analytics