`
沐刃青蛟
  • 浏览: 7456 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

基于比较的排序算法

阅读更多

一、选择排序

 

思路:将总的array分成两个部分,一部分是已经排好序的subarray1,另一部分是待排序的subarray2,每次都从subarray2中选择最小的加入到subarray1中,直至所有的元素加入到subarray1中。

 

实现:

 

Void swap(int *xp,int *yp)

{

Int t=*xp;

*xp=*yp;

*yp=t;

}

 

Void selecttionSort(int arr[],int n)

{

Int i,j,minIndex;

For(i=0;i<n-1;i++)

{

minIndex=i;

For(j=i+1;j<n;j++)

{

If(arr[j]<arr[minIndex])

{

minIndex=j;

}

}

Swap(&arr[i],arr[minIndex]);

}

}

 

时间复杂度:O(n*n)

 

二、冒泡排序

 

思路:将总的array分成两个部分,一部分是已经排好序的subarray2,另一部分是待排序的subarray1,每次都比较临近的两个元素,将较小的的元素置于较大元素之前。遍历一轮之后可找到最大的元素以交换置subarray1末尾,将subarray1中的最后元素归入subarray2

 

实现:

 

Void swap(int *xp,int *yp)

{

Int t=*xp;

*xp=*yp;

*yp=t;

}

 

void bubbleSort(int arr[],int n)

{

int i,j;

for(i=0;i<n-1;i++)

{

for(j=1;j<n-i;j++)

{

if(arr[j]<arr[j-1])

{

swap(&arr[j],&arr[j-1]);

}

}

}

}

 

时间复杂度:O(n*n)

但是上面的算法存在一些缺陷,就是当input的是一个有序的array时,依然需要On*n)的时间,我们可以改进使得当input的是一个有序array时,时间复杂度为O(n).

 

改进之后:

 

void bubbleSort(int arr[],int n)

{

int i,j;

bool swapped; /*增加一个判断是否进行交换的变量,如果遍历一遍依然没有进行交换,说明array是有序的*/

for(i=0;i<n-1;i++)

{

swapped=false;

for(j=1;j<n-i;j++)

{

if(arr[j]<arr[j-1])

{

swap(&arr[j],&arr[j-1]);

swapped=true;

}

}

if(swapped==false)

{

break;

}

}

}

 

 

 

三、插入排序

 

思路:将总的array分成两个部分,一部分是已经排好序的subarray1,另一部分是待排序的subarray2。每次都取出subarray2中的第一个元素,将其插入到subarray1中正确的位置,使得subarray1有序。

 

 

实现:

 

void insertionSort(int arr[],int n)

{

int i,j,key;

for(i=1;i<n;i++)

{

key=arr[i];

j=i-1;

while(j>=0&&arr[j]>key)

{

arr[j+1]=arr[j];

j--;

}

arr[j+1]=key;

}

}

 

时间复杂度:O(n*n)

 

四、归并排序

 

思路:运用分而治之的思想,将大规模的array分解成许多小规模的subarray,将小规模的subarray排成有序之后再组装成有序的array

 

实现:

 

void merge(int arr[],int l,int m,int r)

{

int i,j,k;

int n1=m-l+1;

int n2=r-m;

int L[n1+1],R[n2+1];

for(int i=0;i<n1;i++)

{

L[i]=arr[l+i];

}

for(j=0;j<n2;j++)

{

R[j]=arr[m+1+j];

}

L[i]=INT_MAX;

R[j]=INT_MAX;

i=0;

j=0;

for(k=l;k<=r;k++)

{

if(L[i]<R[j])

{

arr[k]=L[i];

i++;

}else

{

arr[k]=R[j];

j++;

}

}

}

 

void mergeSort(int arr[],int l,int r)

{

if(l<r)

{

int m=(l+r)/2;

mergeSort(arr,l,m);

mergeSort(arr,m+1,r);

merge(arr,l,m,r);

}

}

 

时间复杂度:O(nLogn)

 

 

五、堆排序

思路: 1.建堆,升序为大顶堆,降序为小顶堆

2.交换堆顶元素与最后一个元素

3.堆的规模减1

4.维持大顶堆的性质

5.重复234直到堆的规模为1

 

实现:

 

void heapify(int arr[],int n,int i)

{

int largest=i;

int l=2*i+1;

int r=2*i+2;

if(l<n&&arr[l]>arr[largest])

{

largest=l;

}

if(r<n&&arr[r]>arr[largest])

{

largest=r;

}

if(largest!=i)

{

swap(&arr[largest],&arr[i]);

heapify(arr,n,largest);

}

}

 

void heapSort(int arr[],int n)

{

int i;

//建堆

for(i=n/2-1;i>=0;i--)

{

heapify(arr,n,i);

}

//交换

for(i=n-1;i>0;i--)

{

swap(&arr[0],&arr[i]);

heapify(arr,i,0);//维持堆的性质

}

}

 

 

时间复杂度:O(nLogn)

 

六、快速排序

 

思路:

mergeSort一样,都运用了分而治之的思想。不同的是quickSortarray分成三部分:中间元素pivot,比pivot都小的subarray1,和比pivot都大的subarray2.

 

实现:

 

int partition(int arr[],int l,int r)

{

int pivot=arr[r];

int i=l-1;

int j;

for(j=l;j<r;j++)

{

if(arr[j]<pivot)

{

i++;

swap(&arr[j],&arr[i]);

}

}

swap(&arr[i+1],&arr[r]);

return i+1;

}

 

void quickSort(int arr[],int l,int r)

{

if(l<r)

{

int pi=partition(arr,l,r);

quickSort(arr,l,pi-1);

quickSort(arr,pi+1,r);

}

}

 

时间复杂度:

Average Case : O(nLogn)

Worst Case : O(n*n)

 

而为了最大程度的避开Worst Case,我们可以采用随机版本的quickSort

 

 

int randomNum(int l,int r)

{

    srand((unsigned int)time(NULL));

    return rand()%(r-l+1)+l;

}

int randomizedPartition(int arr[],int l,int r)

{

int ran=randomNum(l,r);

swap(&arr[ran],&arr[r]);

return partition(arr,l,r);

}

void randomizedQuickSort(int arr[],int l,int r)

{

if(l<r)

{

int pi=randomizedPartition(arr,l,r);

randomizedQuickSort(arr,l,pi-1);

randomizedQuickSort(arr,pi+1,r);

}

}

<!--EndFragment-->
分享到:
评论

相关推荐

    基于FPGA的并行全比较排序算法.pdf

    在深入分析这篇标题为“基于FPGA的并行全比较排序算法”的文章之前,先明确几个关键点:FPGA(Field-Programmable Gate Array,现场可编程门阵列),并行处理和排序算法。FPGA是一种可以通过编程来配置的集成电路,...

    浅析基于C语言的常用排序算法比较.pdf

    基于C语言的排序算法比较是一个重要的研究方向,涉及到多种排序方法的对比研究和实际应用分析。 选择排序算法是基于C语言实现的一种基础排序算法,其基本思想是:首先从待排序序列中选出最小(或最大)的一个元素,...

    各种排序算法比较(java实现)

    `Algorithm.java`文件可能包含了这些排序算法的Java实现代码,而`常见排序算法的实现与性能比较.doc`文档则可能详细比较了这些算法的性能和适用场景。`readme.txt`文件可能是对整个项目的简要说明,包括如何运行和...

    基于Qt5-实现九大排序算法的代码汇总

    在本文中,我们将深入探讨如何使用Qt5框架和C++编程语言实现九大经典的排序算法。Qt5是一个跨平台的应用程序开发框架,它提供了丰富的库和工具,使得开发人员能够便捷地构建用户界面和应用程序逻辑。C++则是一种强大...

    基于mfc的内排序算法动态演示

    这个项目"基于MFC的内排序算法动态演示"是一个教学工具,它通过可视化的方式,帮助用户理解并比较多种内排序算法的执行过程。 **内排序算法** 内排序是指数据记录在内存中进行排序,包括但不限于以下几种常见算法...

    基于姓名排序算法动态演示系统的设计与实现

    【基于姓名排序算法动态演示系统的设计与实现】是陕西理工学院一个毕业设计项目,主要目标是利用Java开发语言来构建一个能够动态展示各种排序算法的系统。这个系统不仅关注算法的效率,而且注重用户体验,提供了一个...

    C语言数据结构内部排序算法及比较

    8. **计数排序**、**桶排序**和**基数排序**:这三种属于非比较型排序算法,它们不依赖于元素之间的比较,而是基于特定的性质(如整数的大小、出现频率等)进行排序。它们通常在特定条件下效率较高,但不适合通用...

    数据结构课程设计(内部排序算法比较_C语言)

    ### 数据结构课程设计:内部排序算法比较_C语言 #### 一、课题背景与意义 排序作为数据结构中的重要组成部分,在实际开发中具有广泛的应用场景。理解不同排序算法的特点及其适用场景,对于提高程序效率和解决问题...

    基于二叉树的位排序算法

    基于二叉树的位排序算法是计算机科学中一种高效的排序方法,尤其在处理复杂数据结构和大数据量排序时显示出其优越性。该算法利用了二叉树的性质,通过位操作来实现数据的排序,位排序通常指的是根据数据中特定位的值...

    排序算法(C语言实现)

    堆排序是一种基于比较的排序算法,利用了二叉堆的性质。二叉堆是一种特殊的树形数据结构,满足堆属性:父节点的值总是大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。堆排序通过构建最大堆,然后将堆顶...

    实验 9 排序算法实验比较

    基于教材内容,任选两种排序算法,实现并比较性能。 基本要求 (1)至少要有一种排序算法的性能优于 O(n2 ) (2)对实现的排序算法进行实验比较,实验比较数据参见教材 7.8 章节 (3)排序算法要基于教材,测试输入...

    排序算法的比较 排序算法的比较

    归并排序是基于分治策略的排序算法,它将大问题分解为小问题,然后合并解决。具体步骤包括递归地将数组分为两半,对每一半分别进行排序,最后再合并两个已排序的子数组。归并排序在最坏、最好和平均情况下的时间...

    基于java语言十大经典排序算法

    计数排序不是基于比较的排序算法,它通过统计每个元素出现的次数,然后根据计数结果直接确定元素的最终位置。适用于非负整数排序,且范围不大的场景。 9. **桶排序(Bucket Sort)** 桶排序将元素分布到有限数量的...

    各种排序算法比较

    ### 各种排序算法比较 #### 一、引言 排序是计算机科学中最常见的操作之一,在数据处理和信息检索等领域有着广泛的应用。本篇文章将详细介绍几种经典的排序算法,并对它们进行对比分析,以便读者能够更好地理解和...

    内部排序算法分析

    本主题将深入探讨内部排序算法,并结合C语言代码进行解析。内部排序,顾名思义,是指数据在主存储器(内存)内完成的排序过程,与外部排序相对,后者通常用于处理超出内存容量的大数据集。 1. **基本排序算法**: ...

    排序算法 各种算法的综合

    【排序算法】是计算机科学中的基础且至关重要的概念,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。由于在实际应用中,我们经常需要处理大量的数据,因此【排序算法】的效率至关重要。衡量算法效率...

    java写的基于比较的各种排序算法

    java写的基于比较的各种排序算法,都是一个一个的小函数。简单排序包括:选择排序,插入排序,折半插入排序,冒泡排序。 分治思想的排序包括:归并排序,快速排序,堆排序。 程序把随机生成的整数进行排序,开始时用...

    FPGA并行快速排序算法-位宽可设

    在本文中,我们将深入探讨基于FPGA的并行快速排序算法,特别关注“位宽可设”的特性。这种算法能够高效地处理大量数据,并且在硬件实现上具有很高的灵活性。我们将从以下几个方面来阐述这个主题: 一、快速排序算法...

    常用排序算法java演示

    7. **计数排序(Counting Sort)、桶排序(Bucket Sort)和基数排序(Radix Sort)**:这三种排序算法属于非比较型排序,不依赖于元素间的比较,而是基于特定的特性,如元素的范围、分布等。Java中实现这类排序通常...

Global site tag (gtag.js) - Google Analytics