排序算法是数据结构学科经典的内容,其中内部排序现有的算法有很多种,究竟各有什么特点呢?本文力图设计实现常用内部排序算法并进行比较。分别为起泡排序,直接插入排序,简单选择排序,快速排序,堆排序,针对关键字的比较次数和移动次数进行测试比较。
问题分析和总体设计
ADT OrderableList
{
数据对象:D={ai| ai∈IntegerSet,i=1,2,…,n,n≥0}
数据关系:R1={〈ai-1,ai〉|ai-1, ai∈D, i=1,2,…,n}
1、起泡排序
算法:核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。
//冒泡排序函数
void bsort::bubblesort(double *y, int m)
{
for(i=(m-1);i>0;i--)
{
flag=0;
for(j=1;j<=i;j++)
{
if(y[j-1]>y[j])
{
temp=y[j-1];
y[j-1]=y[j];
y[j]=temp;
flag=1;
}
if(flag==0) break;
}
}
2、直接插入排序
算法:经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。
//插入排序函数
void isort::insertion_sort(double *x, int m)
{
for(i=1;i<m;i++)
{
temp=x[i];
j=i;
while((j>0)&&(x[j-1]>temp))
{
x[j]=x[j-1];
j--;
}
x[j]=temp;
}
3、简单选择排序
算法:首先找到数据清单中的最小的数据,然后将这个数据同第一个数据交换位置;接下来找第二小的数据,再将其同第二个数据交换位置,以此类推。
//shell排序函数
void ssort::shell_sort(double *x, int m)
{
h=3;
while(h>0)
{
for(i=1;i<m;i++)
{
temp=x[i];
j=i;
while((j>=h)&&(x[j-h]>temp))
{
cout<<"排序成功"<<endl;
x[j]=x[j-h];
j-=h;
}
x[j]=temp;
}
if((h/2)!=0) {h/=2;}
else if(h==1) {h=0;}
else{h=1;}
}
4、快速排序
算法:首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序。通常分割点的数据是随机选取的。这样无论你的数据是否已被排列过,你所分割成的两个字列表的大小是差不多的。而只要两个子列表的大小差不多。
//快速排序函数
void quicksort1::quicksort(double *x, int left, int right)
{
l_h=left;
r_h=right;
pivot=x[left];
while(left<right)
{
while((x[right]>=pivot)&&(left<right))
{
right--;
}
if(left!=right)
{
x[left]=x[right];
left++;
}
while((x[right]<=pivot)&&(left<right))
{
left++;
}
if(left!=right)
{
x[right]=x[left];
right--;
}
}
x[left]=pivot;
pivot_loc=left;
left=l_h;
right=r_h;
if(left<pivot_loc){quicksort(x, left, (pivot_loc-1));}
if(right>pivot_loc){quicksort(x,(pivot_loc+1),right);}
}
分享到:
相关推荐
几种常见的排序算法是编程领域中基础且重要的知识点,它们各自有不同的特点和适用场景。本文将详细介绍这些算法,并分析其效率。 一、冒泡排序 冒泡排序是一种简单的排序算法,通过不断交换相邻的两个元素来逐步...
本文将深入探讨几种常见的数字排序方法,包括直接插入法、Shell排序、冒泡排序、快速排序以及选择排序。这些排序方法各有特点,适用于不同的场景,理解并掌握它们对于提升编程技能至关重要。 **1. 直接插入排序...
这篇文章将详细介绍JavaScript中几种常见的排序方法,帮助你更好地理解和运用这些技术。 首先,最基本的排序方法是`Array.prototype.sort()`。这个内置函数可以接受一个比较函数作为参数,用于自定义排序规则。例如...
这份资料"用php实现几种常见的排序算法共6页.pdf.zip"显然包含了关于如何使用PHP实现几种常见排序算法的教程或笔记。 首先,让我们回顾一下几种常见的排序算法,并讨论它们在PHP中的实现: 1. **冒泡排序**...
在给定的文档中,介绍了多种常见的排序算法,包括冒泡排序、快速排序、选择排序、插入排序等,并提供了相应的Java代码实现。 冒泡排序(Bubble Sort)是一种简单的比较排序算法,其基本思想是通过重复遍历待排序...
本文将详细解析几种常见的排序算法:冒泡排序、快速排序、选择排序以及基数排序,并探讨它们的工作原理、效率和适用场景。 **冒泡排序**: 冒泡排序是一种简单直观的排序算法,通过比较相邻元素并交换位置来实现...
### 算法优化的几种常用方法 1. **循环展开**:通过减少循环迭代次数来减少循环开销。 2. **空间换时间**:预先计算结果并存储起来,以避免重复计算。 3. **缓存优化**:通过调整数据访问模式,提高缓存命中率。 4....
本篇文章将深入探讨几种常见的排序算法:直接插入排序、选择排序、冒泡排序以及堆排序,并给出它们的具体代码实现。 #### 直接插入排序 **基本思想**:直接插入排序的基本思想是将一个记录插入到已排序好的有序表...
在这个主题中,我们将深入探讨几种常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序以及堆排序。 **1. 冒泡排序(Bubble Sort)** 冒泡排序是一种简单的排序算法,通过重复遍历待排序的序列...
这里我们主要探讨的是由个人编写的几种排序算法实现,包括插入排序、冒泡排序、选择排序、堆排序、快速排序和基数排序,全部用C++语言完成。这些算法各有特点,适用于不同的场景。 1. 插入排序:插入排序是一种简单...
快速排序和直接插入排序是两种常见的排序算法,它们各自具有不同的特性和应用场景。在实际编程中,有时会根据数据特点和需求将这两种排序方法结合使用,以达到更高效的排序效果。 快速排序是一种由C.A.R. Hoare在...
本文将详细介绍几种常见的排序算法及其Java实现,同时也会涉及二叉树的基本概念和实现。 首先,让我们从最简单的排序算法开始。冒泡排序是一种基础的交换排序方法,它通过重复遍历待排序的数组,依次比较相邻元素并...
这里我们主要讨论的是在数据结构中的几种常见排序方法,包括插入排序、冒泡排序、快速排序以及与二分法相关的排序策略。 1. 插入排序: 插入排序是一种简单直观的排序算法,它的工作原理类似于打扑克牌。初始时,...
程序中实现了几种常见的排序算法,包括冒泡排序、快速排序、插入排序、选择排序以及希尔排序。 #### 3.1 冒泡排序 `BubbleSort` 函数实现了冒泡排序算法,通过不断交换相邻的两个元素来实现排序。 ```c void ...
本文将详细介绍用Java语言实现的几种常见排序算法,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序和堆排序。这些算法各有特点,适用于不同的场景,了解它们可以帮助我们更好地理解和优化代码...
本文将深入探讨几种常见的排序算法,并提供它们的Java实现,旨在帮助开发者提升算法理解和应用能力。 首先,我们从最基础的排序算法——冒泡排序开始。冒泡排序是一种简单的交换排序,通过不断比较相邻元素并交换...
下面将详细介绍其中提及的几种排序算法。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,通过重复遍历待排序的数组,比较相邻元素并交换顺序,使较大的元素逐渐“冒”到数组的末尾。其主要步骤是:比较相邻...
本文将深入分析几种常见的排序方法,并为学习者提供专业指导。 首先,我们来探讨最基本的排序算法——冒泡排序。冒泡排序通过不断交换相邻的错误顺序元素来实现排序,其核心是重复地遍历要排序的数列,一次比较两个...