一、选择排序
思路:将总的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时,依然需要O(n*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.重复2,3,4直到堆的规模为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一样,都运用了分而治之的思想。不同的是quickSort将array分成三部分:中间元素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的并行全比较排序算法”的文章之前,先明确几个关键点:FPGA(Field-Programmable Gate Array,现场可编程门阵列),并行处理和排序算法。FPGA是一种可以通过编程来配置的集成电路,...
基于C语言的排序算法比较是一个重要的研究方向,涉及到多种排序方法的对比研究和实际应用分析。 选择排序算法是基于C语言实现的一种基础排序算法,其基本思想是:首先从待排序序列中选出最小(或最大)的一个元素,...
`Algorithm.java`文件可能包含了这些排序算法的Java实现代码,而`常见排序算法的实现与性能比较.doc`文档则可能详细比较了这些算法的性能和适用场景。`readme.txt`文件可能是对整个项目的简要说明,包括如何运行和...
在本文中,我们将深入探讨如何使用Qt5框架和C++编程语言实现九大经典的排序算法。Qt5是一个跨平台的应用程序开发框架,它提供了丰富的库和工具,使得开发人员能够便捷地构建用户界面和应用程序逻辑。C++则是一种强大...
这个项目"基于MFC的内排序算法动态演示"是一个教学工具,它通过可视化的方式,帮助用户理解并比较多种内排序算法的执行过程。 **内排序算法** 内排序是指数据记录在内存中进行排序,包括但不限于以下几种常见算法...
【基于姓名排序算法动态演示系统的设计与实现】是陕西理工学院一个毕业设计项目,主要目标是利用Java开发语言来构建一个能够动态展示各种排序算法的系统。这个系统不仅关注算法的效率,而且注重用户体验,提供了一个...
8. **计数排序**、**桶排序**和**基数排序**:这三种属于非比较型排序算法,它们不依赖于元素之间的比较,而是基于特定的性质(如整数的大小、出现频率等)进行排序。它们通常在特定条件下效率较高,但不适合通用...
### 数据结构课程设计:内部排序算法比较_C语言 #### 一、课题背景与意义 排序作为数据结构中的重要组成部分,在实际开发中具有广泛的应用场景。理解不同排序算法的特点及其适用场景,对于提高程序效率和解决问题...
基于二叉树的位排序算法是计算机科学中一种高效的排序方法,尤其在处理复杂数据结构和大数据量排序时显示出其优越性。该算法利用了二叉树的性质,通过位操作来实现数据的排序,位排序通常指的是根据数据中特定位的值...
堆排序是一种基于比较的排序算法,利用了二叉堆的性质。二叉堆是一种特殊的树形数据结构,满足堆属性:父节点的值总是大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。堆排序通过构建最大堆,然后将堆顶...
基于教材内容,任选两种排序算法,实现并比较性能。 基本要求 (1)至少要有一种排序算法的性能优于 O(n2 ) (2)对实现的排序算法进行实验比较,实验比较数据参见教材 7.8 章节 (3)排序算法要基于教材,测试输入...
归并排序是基于分治策略的排序算法,它将大问题分解为小问题,然后合并解决。具体步骤包括递归地将数组分为两半,对每一半分别进行排序,最后再合并两个已排序的子数组。归并排序在最坏、最好和平均情况下的时间...
计数排序不是基于比较的排序算法,它通过统计每个元素出现的次数,然后根据计数结果直接确定元素的最终位置。适用于非负整数排序,且范围不大的场景。 9. **桶排序(Bucket Sort)** 桶排序将元素分布到有限数量的...
### 各种排序算法比较 #### 一、引言 排序是计算机科学中最常见的操作之一,在数据处理和信息检索等领域有着广泛的应用。本篇文章将详细介绍几种经典的排序算法,并对它们进行对比分析,以便读者能够更好地理解和...
本主题将深入探讨内部排序算法,并结合C语言代码进行解析。内部排序,顾名思义,是指数据在主存储器(内存)内完成的排序过程,与外部排序相对,后者通常用于处理超出内存容量的大数据集。 1. **基本排序算法**: ...
【排序算法】是计算机科学中的基础且至关重要的概念,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序排列。由于在实际应用中,我们经常需要处理大量的数据,因此【排序算法】的效率至关重要。衡量算法效率...
java写的基于比较的各种排序算法,都是一个一个的小函数。简单排序包括:选择排序,插入排序,折半插入排序,冒泡排序。 分治思想的排序包括:归并排序,快速排序,堆排序。 程序把随机生成的整数进行排序,开始时用...
在本文中,我们将深入探讨基于FPGA的并行快速排序算法,特别关注“位宽可设”的特性。这种算法能够高效地处理大量数据,并且在硬件实现上具有很高的灵活性。我们将从以下几个方面来阐述这个主题: 一、快速排序算法...
7. **计数排序(Counting Sort)、桶排序(Bucket Sort)和基数排序(Radix Sort)**:这三种排序算法属于非比较型排序,不依赖于元素间的比较,而是基于特定的特性,如元素的范围、分布等。Java中实现这类排序通常...