`

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

    博客分类:
  • 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

    【排序算法性能分析】 在计算机科学中,排序算法是用于重新排列一组数据的算法,使得数据按照特定的顺序排列。本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析...

    内部排序算法的性能分析

    本项目针对内部排序算法进行了性能分析,通过设计一个测试程序,对比了几种常见内部排序算法的关键字比较次数和移动次数,以帮助我们更直观地理解不同算法的效率差异。以下是关于内部排序算法的一些关键知识点: 1....

    各大内部排序算法性能分析

    - **性能分析正文**:详细阐述每种排序算法的实现细节、运行时间和空间占用,可能包括图表展示和统计分析。还会讨论算法在不同数据结构和随机性下的表现,并对比不同算法的优劣。 通过这些分析,我们能更好地理解...

    内部排序算法性能分析

    在"内部排序算法性能分析"的项目中,你可能会对比各种排序算法的实现,通过模拟不同规模的数据集来测量它们的执行时间和内存消耗。通过这样的实践,可以更好地理解每种算法的特性,并为实际编程提供指导。这是一项有...

    几种排序算法整理

    本文将深入探讨由C语言实现的几种常见排序算法,包括它们的基本原理、实现细节和性能特点。 首先,让我们从最经典的排序算法——冒泡排序(Bubble Sort)开始。冒泡排序通过不断地交换相邻的不正确顺序的元素来逐步...

    最常见的几种排序算法,来看看

    这里我们将深入探讨几种最常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序以及归并排序。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序算法之一,它通过不断地比较相邻元素并交换位置来实现...

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

    最后,根据实验数据和结果,可以分析出在特定数据集上哪种排序算法更为高效。 总的来说,这个实验旨在通过实践操作,让学生更好地理解各种排序算法的时间复杂度和实际运行效率,为以后的算法设计和分析打下基础。

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

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

    几种排序算法总结及比较

    这里我们将深入探讨几种常见的排序算法,并在VS2013环境下进行实现和比较。 1. 冒泡排序(Bubble Sort) 冒泡排序是一种简单的交换排序,它通过重复遍历待排序的数列,依次比较相邻元素并根据需要交换位置,直到...

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

    2. 使用全局变量`times`和`changes`来统计每种排序算法的比较次数和移动次数(关键字交换被视为3次移动)。 3. 在主函数中调用各个排序算法的自定义函数,然后输出比较和移动次数的结果。 4. 程序的结构包括创建数组...

    几种常见排序算法实例

    本文将详细解析标题中提及的五种排序算法:位与、选择、冒泡、插入以及qsort,并结合在VC6.0环境下进行编译实践的情况。 1. **位与排序**: 位与操作符(`&`)在某些特定场景下可用于排序,例如在整数数组中,通过...

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

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

    几种排序算法的比较

    本篇文章将详细探讨几种常见的排序算法,并结合VB编程环境进行比较。 1. 冒泡排序:冒泡排序是最基础的排序算法之一,通过不断交换相邻的不正确顺序元素来逐步完成排序。在VB中,可以使用For和If语句实现冒泡排序。...

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

    使用LinkedHashMap记录每种排序算法的平均运行时间和空间占用。实验还涉及了排序过程的可视化,通过对算法关键步骤的绘图,动态展示排序过程,帮助理解算法的工作原理。 实验结果显示,随着数据规模的增加,插入...

    数据结构中各种排序算法的比较与分析

    通过对以上几种排序算法的分析,我们可以看出不同算法有着各自的特点和适用场景。例如,在数据规模较小或者对稳定性有一定要求的情况下,插入排序和选择排序是不错的选择;而对于大规模数据的排序任务,则更适合采用...

    中科大算法导论课程实验 常见排序算法的实现与性能比较 报告

    由于要求字数需大于1000字,因此在实际的教学或研究场合中,每种排序算法的理论背景、时间复杂度分析、空间复杂度、稳定性和实际应用场景等都需要更为详尽的讨论。在实验报告中,通过实验数据的对比分析,可以获得对...

    java编写的几种排序算法

    本文将深入探讨在Java中实现的几种常见排序算法:冒泡排序、快速排序以及堆排序。 1. **冒泡排序(Bubble Sort)** 冒泡排序是最简单的排序算法之一,通过重复遍历数组,比较相邻元素并交换位置,直到没有任何一对...

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

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

Global site tag (gtag.js) - Google Analytics