排序算法与性能分析
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由哪些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。
{
int mt=0;//移动次数movetime
int ct=0;//比较次数cmdtime
摘
计算机的日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及插入、删除、排序、查找等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。
算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。
int pivotpos; //划分后的基准记录的位置
if(low<high)
{ //仅当区间长度大于1时才须排序
pivotpos=Partition(R,low,high); //对R[low…high]做划分
QuickSort(R,low,pivotpos-1); //对做区间递归排序
QuickSort(R,pivotpos+1,high); //对右区间递归排序
while(i<j&&R[j].key>=pivot.key) //pivot相当于在位置i上
j--; //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j]
if(i<j) //表示找到的R[j]的关键字<pivot.key
R[i++]=R[j]; //相当于交换R[i]和R[j],交换后i指针加1
while(i<j&&R[i].key<=pivot.key) //pivot相当于在位置j上
i++; //从左向右扫描,查找第1个关键字大于pivot.key的记录R[i]
if(i<j) //表示找到了R[i],使R[i].key>pivot.key
R[j--]=R[i]; //相当于交换R[i]和R[j],交换后j指针减1
不稳定
堆排序
O(nlog2n)
O(nlog2n)
O(nlog2n)
O(1)
不稳定
归并排序
O(nlog2n)
O(nlog2n)
O(nlog2n)
O(n)
稳定
5.
6.
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include <stdio.h>
关键词:排序算法;性能分析;排序算法性能分析;C语言
前
排序是计算机程序设计中的一种重要操作。它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。内部排序的方法很多,但是就其全面性能而言,很难 提出一种被认为是最好的方法,每一种方法都有各自的优缺点,适合在不同的环境下使用。如果按排序过程中依据的不同原则对内部排序方法进行分类,则大致可分为插入排序,冒泡排序,快速排序,归并排序、选择排序、堆排序等。
R[j]=R[0];
exchange=TRUE; //发生了交换,故将交换标志置为真
}
if(!exchange) //本趟排序未发生交换,提前终止算法
return;
}
}
(5)快速排序
void QuickSort(SeqList R,int low,int high)
{
//对R[low…high]快速排序
printf("\n比较次数:%d\n",ct);//输出各排序比较次数
printf("移动次数:%d\n\n",mt);//输出各排序移动次数
}
void bubble_sort(int n,int A[])//冒泡排序
{
int mt=0;//移动次数mt=movetime
int ct=0;//比较次数ct=cmdtime
b、算法的时间复杂度和空间复杂度
排序方法
平均时间
最坏情况
最好情况
辅助时间
稳定性
直接插入排序
O(n2)
O(n2)
O(n)
O(1)
稳定
直接选择排序
O(n2)
O(n2)
O(n2)
O(1)
稳定
冒泡排序
O(n2)
O(n2)
O(n)
O(1)
稳定
快速排序
O(nlog2n)
O(n2)
O(nlog2n)
O(log2)
{
R[0]=R[i];
for(j=i-1;R[0]<R[j];--j)
R[j+1]=R[j];//记录后移
R[j+1]=R[0];//插入到正确位置
}
}
(2)折半插入排序
BinsertSort(RecordnodeR[],int n)
{
for(i=2;<=n;++i)
{
R[0]=R[i];
low=1;high=i-1;
for(int x=0;x<1000;x++)
printf("%d\t",rand()%100);
}
void output(int n,int a[],int ct,int mt)//内部排序中调用的输出函数
{
int i;
printf("\n排序结果:");
for( i=0;i<n;i++)
printf("%d\t",a[i]);//输出各排序完成的数组
int ct=0;//比较次数cmdtime
int i,j,temp,k;
int a[N];
for(i=0;i<n;i++)
a[i]=A[i];//使数组a[]与数组A[]完全相同,对数组a[]进行操作(不改动A[],可以使A[]被其他函数调用)
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++,ct++)
《算法与数据结构》主要介绍一些最常用的数据结构及基本算法设计,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程。它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
}
}//QuickSort
int Partition(SeqList R,int i,int j)
{
//调用Partition(R,low.high)时,对R[low…high]做划分,返回基准记录的位置
ReceType pivot=R[i]; //用区间的第1个记录作为基准
while(i<j)
{//从区间两端交替向中间扫描,直至i=j为止
R[i]=R[j];
R[j]=x
bool=0
}
} while(d>1)
}
}
(4)冒泡排序
void BubbleSort(SeqList R)
{
//R(1…n)是待排序的文件,采用自上向下扫描,对R做冒泡排序
int i,j;
Boolean exchange; //交换标志
for(i=1;i<n;i++)
if(low<up)
{
i=low;
j=up;
temp=a[low],
qmt++;
while(i!=j)
{
qct++;
while(i<j&&a[j]>temp)
j--,
qct++;
if(i<j)
a[i++]=a[j],
qct++;
qmt++;
while(i<j&&a[i]<=temp)
i++,
qct++;
if(i<j)
a[j--]=a[i],
qct++,
qmt++;
}
a[i]=temp,
qmt++;
quick(a,low,j-1);
quick(a,i+1,up);
}
}
void quick_sort(int n,int A[])//快速排序(通过调用快速排序递归算法完成)
{
int i;
int a[N];
ShellSort(RecordnodeR[], int n)
{
//用希尔排序法对一个记录r[]排序
int i,j,d;
int bool;
int x;
d=n;
do{ d=[d/2];
bool=1
for(i=1;i<=L.length-d;i++){Fra bibliotekj=i+d
if(R[i]>R[j])
{
x=R[i];
int i,j,temp;