#include<iostream>
using namespace std;
//辅助函数,交换两数之值
template<class T>
void mySwap(T &x, T &y){
T temp = x;
x = y;
y = temp;
}
const int size = 10;
//一、用直接插入排序法对数组a中元素进行升序排序
/*直接插入排序的基本思想是:
*顺序地把待排序序列中的各个记录按其关键字的大小,插入到已排序的序列的适当位置。
*/
template<class T>
void insertionSort( T a[], int n){
//将下标为1~n-1的元素逐个插入到已排序序列中适当的位置
for (int i = 1; i != n; i++){
//从a[i-1]开始向a[0]方向扫描各元素,寻找适当位置插入a[i]
int j = i;
T temp = a[i];
while (j > 0 && temp < a[j - 1]){
//逐个比较,直到temp>=a[j-1]时,j便是应插入的位置
//若达到j==0,则0是应插入的位置
a[j] = a[j - 1];//将元素逐个后移,以便找到插入位置使可立即插入
j--;
}
//插入位置已找到,立即插入
a[j] = temp;
for (int i = 0; i != n; i++){//输出每步交换
cout << a[i] << " ";
}
cout << endl;
}
}
//二、用选择法对数组a中元素进行升序排序
/*
*选择排序的基本思想是:
*不断从待排序的序列中选取关键字最小的记录放到已排序的记录序列的后面,直到序列中所有记录都已排序为止。
*/
template<class T>
void selectionSort(T a[], int n){
for (int i = 0; i != n - 1; i++){
int leastIndex = i;//最小元素的下标初值设为i
//在元素a[i+1]....a[n-1]中逐个比较,显出最小值
for (int j = i + 1; j < n; j++){
if (a[j] < a[leastIndex])//smallIndex始终记录当前找到的最小值的下标
leastIndex = j;
}
mySwap(a[i], a[leastIndex]);//将这一趟找到的最小元素与a[i]交换
for (int i = 0; i != n; i++){//输出每步交换
cout << a[i] << " ";
}
cout << endl;
}
}
//三、用起泡法对数组a中元素进行升序排序
/*起泡排序的基本思想是:
*将待排序序列中第一个记录的关键字R1与第二个记录的关键字R2做比较,
*如果R1>R2,则交换R1和R2的位置,否则不交换;
*然后继续对当前序列中的第二个记录和第三个记录同样的处理,依此类推。
*/
template<class T>
void bubbleSort(T a[], int n){
int i = n - 1; //i是下一趟需参与排序交换的元素的最大下标
while (i > 0){ //继续排序过程,直到最后一趟排序没有交换发生,或已达n-1趟
int lastExchangeIndex = 0; //每一趟开始时,设置交换标志为0
for (int j = 0; j < i; j++){ //每一趟对元素a[0]....a[i]进行比较和交换
if (a[j + 1] < a[j]){ //如果元素a[j+1]<a[j],交换
mySwap(a[j], a[j + 1]);
for (int x = 0; x != size; x++){ //输出每步交换
cout << a[x] << " ";
}
cout << endl;
lastExchangeIndex = j; //记录被交换的的一对元素中较小的下标
}
}
i = lastExchangeIndex; //将i设置为本趟被交换的最后一对元素中较小的下标
}
}
//四、用希尔排序法对数组a中元素进行升序排序
/*希尔排序的基本思想是:
*不断把待排序的记录分成若干个小组,对同一组内的记录进行排序,
*在分组时,始终保证当前组内的记录个数超过前面分组排序时组内的记录个数。
*/
template<class T>
void shellSort(T a[], int n){
for (int i = 0; i != size; i++){
cout << a[i] << " ";
}
cout << endl;
for (int i = n / 2; i > 0; i /= 2){
for (int j = i; j < n; j++){
int temp = a[j];
int k = 0;
for (k = j; k >= i; k -= i){
if (temp < a[k - i]){
a[k] = a[k - i];
}else
break;
}
a[k] = temp;
for (int i = 0; i != size; i++){
cout << a[i] << " ";
}
cout << endl;
}
}
}
//五、用快速排序法对数组a中元素进行升序排序
/**该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
*/
void quickSort(int s[], int l, int r)
{
if (l< r)
{
int i = l, j = r, x = s[l];
while (i < j)
{
while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if (i < j)
s[i++] = s[j];
while (i < j && s[i]< x) // 从左向右找第一个大于等于x的数
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
for (int i = 0; i != size; i++){
cout << s[i] << " ";
}
cout << endl;
quickSort(s, l, i - 1); // 递归调用
quickSort(s, i + 1, r);
}
}
int main(){
int a[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 };
int b[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 };
int c[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 };
int d[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 };
int e[10] = { 13, 3, 1, 5, 2, 421, 2, 4, 3, 15 };
cout << endl;
for (int i = 0; i != size; i++){
cout << a[i] << " ";
}
cout << endl;
cout << "*********直接插入排序法************" << endl;
insertionSort(a, size);
cout << "*******直接插入排序法结束**********" << endl;
cout << endl;
for (int i = 0; i != size; i++){
cout << b[i] << " ";
}
cout << endl;
cout << "*********选择排序法************" << endl;
selectionSort(b, size);
cout << "*******选择排序法结束**********" << endl;
cout << endl;
for (int i = 0; i != size; i++){
cout << c[i] << " ";
}
cout << endl;
cout << "*********起泡排序法************" << endl;
bubbleSort(c, size);
cout << "*******起泡排序法结束**********" << endl;
cout << endl;
for (int i = 0; i != size; i++){
cout << d[i] << " ";
}
cout << endl;
cout << "*********希尔排序法************" << endl;
shellSort(d, size);
cout << "*******希尔排序法结束**********" << endl;
cout << endl;
for (int i = 0; i != size; i++){
cout << d[i] << " ";
}
cout << endl;
cout << "*********快速排序法************" << endl;
quickSort(e, 0,size-1);
cout << "*******快速排序法结束**********" << endl;
for (int i = 0; i != size; i++){
cout << e[i] << " ";
}
cout << endl;
}
分享到:
相关推荐
在本实验中,我们主要关注的是使用C++编程语言实现三种经典的排序算法:冒泡排序(Bubble Sort)、选择排序(Selection Sort)以及快速排序(Quick Sort)。这些排序算法是计算机科学基础课程中的重要组成部分,它们...
本主题聚焦于使用C++实现六种不同的排序算法,并应用于四种不同类型的数据。这些排序算法包括了冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,它们各自有其独特的性能特征和适用场景。以下是对这六种...
简单的堆排序算法:以定长数组为例,动态数组等可以以此类推
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法,通过选取一个“基准”元素,将数组分为两个子数组,使得左边的元素都小于基准,右边的元素都大于基准,然后对这...
本文将探讨如何使用这两种语言实现几种基本的排序算法:冒泡排序、选择排序,以及两种全比较排序(并行和串行)。 首先,让我们了解一下排序算法。排序是计算机科学中最基础的操作之一,它涉及到将一组数据按照特定...
本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...
本文将深入探讨C++实现的几种常见排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序以及堆排序。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果...
本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年提出,是一种改进的插入排序。它的基本思想是通过设置一个增量序列,将待排序的元素按照...
本资源"总结了各种排序算法,并用C++代码实现,并有演示",提供了丰富的学习材料,包括不同类型的排序算法以及它们的C++实现,还有可能的可视化演示,帮助理解每种算法的工作原理。 首先,让我们逐一了解常见的排序...
这里我们将深入探讨七种常用的排序算法,并通过C++语言实现它们。这七种算法分别是:冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序和快速排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之...
本书共分为四个部分,内容覆盖了算法的基础知识、数据结构、排序算法以及搜索算法。Sedgewick在新版中对内容进行了充分的扩展和更新,使得本书更为全面和实用。在算法基础部分,作者讲解了算法设计和分析的基本概念...
在这个C++实现的项目中,我们有三种经典的排序算法被可视化:冒泡排序、插入排序和选择排序。这些算法的可视化能够帮助我们更好地理解它们的工作原理。** ### 冒泡排序 冒泡排序是最基础的排序算法之一,它通过重复...
C++ 实现的十大常见排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、基数排序和桶排序。每种排序算法都有其特点和适用场景。
一个堆排序算法 c++写的 逻辑相同 可自行 改为java 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一个堆排序算法 c++ 写一...
用c++实现的快速排序算法 算法实现的简单易懂
完整的自然归并排序算法源程序,可自行输入待排元素个数以及数值,输出排好序的序列。
该算法用C++语言实现了基数排序算法,已经调试通过,在Linux系统环境中运行结果正常
在IT领域,排序算法是计算机科学中的基础但至关重要的部分,尤其在编程语言如C++中,理解并能实现各种排序算法对于提升程序性能至关重要。本文将深入探讨标题"6种排序算法的C++实现"中涉及的六种经典排序算法,并...
下面我们将详细讨论这四种排序算法的实现原理以及它们在C++中的应用。 1. **冒泡排序(Bubble Sort)** 冒泡排序是一种简单的交换排序,它通过不断比较相邻元素并交换位置来逐步将最大或最小的元素“冒”到数组的...
本报告记录了使用 C++ 初步实现的七种排序算法的基本原理及其在实际样例下的性能评估结果。这些算法包括: 冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 归并排序(Merge Sort)...