在大学计算机专业类的本科学生中,我想《数据结构》一定是必修课吧。而在本科阶段数据结构的最大用途莫过于写排序算法。排序分为内排序和外排序两种。
1、 内排序是针对于规模较小的数据进行处理,一般这些数据都直接存储在计算机的内存中。
2、 外排序则是针对规模较大的数据进行处理,这些数据是不能一次性存入计算机的内存的,大部分数据都存在计算机的辅存(磁盘)中。
在这里我所说的排序是指内排序。
下面我将介绍三种最常见也是最易理解最简单的排序(假定从小到大的排)。
冒泡排序、选择排序、插入排序:尽管这三种代码简单易懂而且容易实现,但是如果要处理的数据比较多,你就会发现他们慢得令人无法忍受。可是在某些情况下这些简单的算法也许就是你没有想到的最好的算法。
下面为了描述方便用数据:42,20,17,13,28,14,23,15来说明
其UML图描述:SortUML.PNG
1、 冒泡排序(BubbleSort)
冒泡排序在有些书中也称为起泡排序,因其排序方法过程像是气泡从水底向上冒。气泡排序包括一个简单的双重for语句。第一个for循环表示比较趟数,第二个for则是两个相邻的数据进行比较,如果前面数据关键值大于后面的关键值,这两个数据则进行交换。
其算法代码如下:
//冒泡排序实现
template<class Elem>
void Sort<Elem>::BubbleSort()
{
int i,j;
int flag;
for(i=0;i < Size;i++)
{
for(j=0;j < Size-i-1;j++)
{
if(Data[j]>Data[j+1])
{
int tem = Data[j];
Data[j] = Data[j+1];
Data[j+1] = tem;
}
}
}
}
数据演示:BubbleSort.png
其算法时间复杂度很容易看出
2、 插入排序(InserSort)
插入排序逐个处理待排序的数据记录,每个新记录与前面已经排好的子序列进行比较,并将它插入合适的位置
其代码如下:
//插入排序实现
template<class Elem>
void Sort<Elem>::InsertSort()
{
for(int i=1;i<Size;i++)
{
for(int j=i;j>0;j--)
{
if(Data[j]<Data[j-1])
{
int tem = Data[j];
Data[j]=Data[j-1];
Data[j-1]=tem;
}
}
}
}
图示演示:InsertSort.png
其算法时间复杂度:
选择排序(SelectSort)
选择排序是第i次选出该组数据中第i小的元素数据,并将它放在数组的第i个元素。换句话说,选择排序就是依次找出待排序数据中最小的数,并把他们按从前到后的顺序放置。其代码:
//选择排序的实现
template<class Elem>
void Sort<Elem>::SelectSort()
{
for(int i = 0;i < Size-1;i++)
{
int minIndex = i;
for(int j = i+1;j<Size;j++)
{
if(Data[j]<Data[minIndex])
{
minIndex = j;
}
}
if(minIndex != i)
{
int tem = Data[i];
Data[i] = Data[minIndex];
Data[minIndex] = tem;
}
}
}
其图示表示:SelectSort.png
其算法时间复杂度也为
其实按算法角度来说,上面的冒泡排序程序还可以得到一些优化,从图示可以当for循环还没结束时,排序就已经排好了,即此时各个数据已经到了其应该在的位置。在这里我们其实可以设一个标志变量flag,令其初始值为0,若交换语句执行了flag = 1;故可以当内循环每次结束时,可以判断是否进行过交换,如果没交换则退出。
其他程序代码:
#pragma once
#include<iostream>
using namespace std;
#include<time.h>
const int Max = 40;
template<class Elem>
class Sort
{
public:
Sort();
~Sort();
void BubbleSort();//冒泡排序
void InsertSort();//插入排序
void SelectSort();//选择排序
void OutPut();//输出数据
private:
int Size;
Elem Data[Max];
};
/*
Sort构造函数,其构造数据的规模以及随机生成需要排序的数据
*/
template<class Elem>
Sort<Elem>::Sort()
{
cout<<"请输入要生成随机数的个数:";
int size;
cin>>size;
Size = size;
srand(time(0));
for(int i = 0;i < Size;i++)
{
Data[i] = rand()%100;//得到0---100的整数
}
}
//输出数据
template<class Elem>
void Sort<Elem>::OutPut()
{
for(int i = 0;i<Size;i++)
{
cout<<Data[i]<<" ";
if(9 == i%10)
{
cout<<endl;
}
}
}
template<class Elem>
Sort<Elem>::~Sort(){}
其他排序将在后来发布
由于显示问题,我不会将图片插入文章中只好利用文件附件方式了
上面算法时间复杂度:Time.png
- 大小: 15.4 KB
- 大小: 34.7 KB
- 大小: 25.5 KB
- 大小: 24.3 KB
- 大小: 2 KB
分享到:
相关推荐
总结来说,堆排序是一种利用堆数据结构进行排序的有效方法,它包括了建堆和调整堆两个关键步骤。在C++中,堆排序可以通过自定义函数实现,如`heapify()`、`buildHeap()`和`heapSort()`。理解并实践这些函数的编写,...
6. 堆排序(Heap Sort):堆是一种特殊的树形数据结构,堆排序利用大顶堆或小顶堆的性质进行排序。它在原地排序,时间复杂度为O(n log n)。 7. 计数排序(Counting Sort):非基于比较的排序算法,适用于整数范围...
在IT领域,数据结构与算法是核心组成部分,而排序问题是数据结构中不可或缺的一部分。本主题主要聚焦于数据结构试验中的排序问题,通过C语言来实现内部排序算法。下面将详细介绍这些概念及其相关知识。 首先,数据...
c语言版本的数据结构的快速排序算法,适用于新手学习
数据结构冒泡排序算法 数据结构冒泡排序算法
二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的数据结构,它具有以下特性:对于树中的任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中所有节点的值都大于该节点的值。这种特性使得在二叉...
### 数据结构排序实验报告知识点解析 #### 实验背景与目的 - **实验背景**:本实验报告来源于南昌大学科学技术学院信息学科部计算机系的一次专业课程实验。《数据结构》作为一门重要的计算机基础课程,其目的在于...
在计算机科学领域,数据结构与算法是至关重要的基础,而排序则是其中不可或缺的一部分。排序算法是用于重新组织数据序列,使其按照特定标准(如升序或降序)排列的算法。这里我们将深入探讨标题和描述中提及的一些...
在计算机科学领域,数据结构和排序算法是至关重要的基础,它们直接影响到程序的效率和性能。本资源包“数据结构-各种排序完整示例程序”提供了C语言实现的各种经典排序算法,帮助学习者深入理解并掌握这些算法的实际...
数据结构拓扑排序
内部排序则是数据结构中的一个重要部分,它指的是在计算机内存中对数据进行排序的方法。本实验报告将深入探讨四种经典的内部排序算法:冒泡排序、基数排序、快速排序和希尔排序,以及它们在C++和C语言中的实现。 1....
数据结构与排序是计算机科学中的核心概念,它们在编程和算法设计中扮演着至关重要的角色。数据结构是指在计算机中组织和存储数据的方式,而排序则是对这些数据进行有效处理的关键技术。 首先,我们来深入了解一下...
排序算法是数据结构中不可或缺的一部分,它们在计算机科学领域扮演着关键角色,用于组织和处理数据。本篇将深入探讨数据结构实验中常见的几种排序算法,包括插入排序、冒泡排序、选择排序以及快速排序,通过分析它们...
在这个名为“数据结构实验排序程序”的项目中,我们主要关注的是数据的排序方法,这是数据处理的关键环节。源程序是指用编程语言编写的原始代码,它是执行特定任务的指令集合。 直接排序,也称为简单排序,通常是指...
数据结构排序一章的希尔结构排序,显示结果的
数据结构是计算机科学中的核心课程之一,而内部排序则是数据结构中的重要组成部分,它涉及到如何高效地对大量数据进行排序。严蔚敏教授的《数据结构》是一本经典的教材,其中第十章专门讲解了内部排序算法。内部排序...
数据结构课程设计是计算机科学与技术专业中一项重要的实践性教学环节,主要目的是让学生深入理解并熟练掌握数据结构的基本概念、原理以及应用。在“排序综合课程设计”中,学生通常会被要求实现多种排序算法,并对...
数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数...
根据给定文件的信息,我们可以总结出以下关于“数据结构 快速排序 输出每一趟结果”的知识点: ### 一、快速排序的基本概念 快速排序是一种高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列...