【数据结构】第十五周-排序

news/2024/11/30 0:48:17/
  1. 1. 快速排序

【问题描述】输入一组数据,以0作为输入的结束,分别采用冒泡排序、选择排序、快速排序的方法,对其进行从小到大的排序,给出排序后的结果。

【输入形式】一组数据,以0作为输入的结束

【输出形式】三种排序后的结果

【样例输入】

9 8 4 5 7 2 10 6 0
【样例输出】

2 4 5 6 7 8 9 10

2 4 5 6 7 8 9 10

2 4 5 6 7 8 9 10

//快速排序
#include<iostream>
using namespace std;int partition(int arr[], int low, int high) {int num = arr[low];while(low < high) {while(low < high && arr[high] > num) {high--;}arr[low] = arr[high];while(low < high && arr[low] <=num) {low++;}arr[high] = arr[low];}arr[low] = num;return low;
}void QuickSort(int arr[],int L,int R)
{if(L<R){int mid=partition(arr,L,R);QuickSort(arr,L,mid-1);QuickSort(arr,mid+1,R);}
}
void BubbleSort(int arr[],int n)
{for(int i=0;i<n-1;i++){for(int j=i+1;j<n;j++){if(arr[i]>arr[j]){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}}
}
void ChooseSort(int arr[],int n)
{int minnum;for(int i=0;i<n-1;i++){minnum=i;for(int j=i+1;j<n;j++){if(arr[minnum]>arr[j])minnum=j;}	int temp=arr[i];arr[i]=arr[minnum];arr[minnum]=temp;}}
void travel(int arr[],int n)
{for(int i=0;i<n;i++)cout<<arr[i]<<" ";cout<<endl;}
int main()
{int x;int a[100],b[100],c[100];int n=0;cin>>x;while(x!=0){a[n]=x;b[n]=x;c[n]=x;cin>>x;n++;}
//	travel(a,n);BubbleSort(a,n);ChooseSort(b,n);QuickSort(c,0,n-1);travel(a,n);travel(b,n);travel(c,n);
}
  1. 2. 希尔排序

【问题描述】给出一组数据,请用希尔排序将其按照从小到大的顺序排列好。

【输入形式】原始数据,以0作为输入的结束;第二行是增量的值,都只有3个。

【输出形式】每一趟增量排序后的结果

【样例输入】

8 3 6 1 68 12 19 3 1 0

5 3 1

【样例输出】

8 3 3 1 68 12 19 6 1
1 3 1 8 6 3 19 68 12
1 1 3 3 6 8 12 19 68

【样例输入】

5 3 9 8 2 4 1 7 10 6 0

4 2 1

【样例输出】

2 3 1 7 5 4 9 8 10 6
1 3 2 4 5 6 9 7 10 8
1 2 3 4 5 6 7 8 9 10

//希尔排序
//8 3 6 1 68 12 19 3 1 0
#include<iostream>
using namespace std;void Shell(int a[],int n,int incr)
{int j;
for(int i=0;i+incr<n;i++)
{int x=a[i+incr];for( j=i;j>=0;j-=incr){if(x<a[j]) //18<10{a[j+incr]=a[j];}else break;}a[j+incr]=x;
}
}
void ShellSort(int a[],int n,int d[])
{for(int i=0;i<3;i++){Shell(a,n,d[i]);for(int j=0;j<n;j++)cout<<a[j]<<" ";cout<<endl;}
}
int main()
{int a[100],n,i=0;while(cin>>a[i]&&a[i])//输入数据 i++;  n=i;
//	Shell(a,n);
//	for(int i=0;i<n;i++)
//	 cout<<a[i]<<" ";int d[10];cin>>d[0]>>d[1]>>d[2];ShellSort(a,n,d);} 

  1. 3. 堆排序

【问题描述】请用堆排序的方法对一组数据进行排序,并给出建堆以及每一趟堆排序的结果。
【输入形式】一组数据,以0作为输入的结束。
【输出形式】建大根堆的结果,以及每一趟堆排序的结果。
【样例输入】

8 3 6 1 68 12 0

【样例输出】

68 8 12 1 3 6
12 8 6 1 3 68
8 3 6 1 12 68
6 3 1 8 12 68
3 1 6 8 12 68
1 3 6 8 12 68

【样例输入】

12 9 26 11 38 52 99 27 66 15 32 0

【样例输出】

99 66 52 27 38 12 26 9 11 15 32
66 38 52 27 32 12 26 9 11 15 99
52 38 26 27 32 12 15 9 11 66 99
38 32 26 27 11 12 15 9 52 66 99
32 27 26 9 11 12 15 38 52 66 99
27 15 26 9 11 12 32 38 52 66 99
26 15 12 9 11 27 32 38 52 66 99
15 11 12 9 26 27 32 38 52 66 99
12 11 9 15 26 27 32 38 52 66 99
11 9 12 15 26 27 32 38 52 66 99
9 11 12 15 26 27 32 38 52 66 99

排序算法:堆排序【图解+代码】_哔哩哔哩_bilibili

//堆排序
#include<iostream>
#include<bits/stdc++.h>
using namespace std;void SiftAdjust(int a[],int n,int i)
{//n是a数组有效数据的范围,它是慢慢变小的//i是要调整的那个节点的编号 int f,left;//f 用来记忆双亲 left算出i的左孩子编号 for(f=i,left=2*i+1;left<=n-1;)//计算新的孩子{//f记下要调整的i号节点,keft就变成右孩子的下标 if(left+1<=n-1 && a[left]<a[left+1] )//右孩子存在,且,右边值更大 left=left+1;//left++  left就变成右孩子的下标 if(a[left]>a[f])//孩子的最大值和双亲f比,若孩子更大,则交换 {int t=a[left];a[left]=a[f];a[f]=t;}else break; //孩子的值 小,就结束 return  f=left; //继续向下调整,刚才的孩子成为新的双亲,再上去计算新的孩子 left=2*f+1; //计算出新孩子,这句话放for表达式3也可以 }}
void HeapSort(int a[],int n)
{//8 3 6 1 68 12 19 3 1//k=0 1 2 3 4 5 6 7 8//调整 中间节点 for(int i=(n-2)/2;i>=0;i--){SiftAdjust(a,n,i);} //调整根节点 for(int j=0;j<n;j++)cout<<a[j]<<" ";	cout<<endl;for(int i=0;i<n-1;i++){int t=a[n-1-i];// n-1 n-2 n-3 n-4a[n-1-i]=a[0];a[0]=t;//交换第一个与最后一个数SiftAdjust(a,n-1-i,0);//调整剩下n-1-i个 维护根 for(int j=0;j<n;j++)cout<<a[j]<<" ";cout<<endl;}
}
int main()
{int a[100],i=0;while(cin>>a[i]&&a[i]){i++;}int n=i;HeapSort(a,n);return 0;} 

维护堆函数

  1. void heapify(int arr[],int n,int i)
    {int largest=i;int lson=i*2+1;int rson=i*2+2;if(lson<n && arr[largest]<arr[lson])largest=lson;if(rson<n&&arr[largest]<arr[rson])largest=rson;//找出三个节点中最大的节点 if(largest!=i){swap(&arr[largest],&arr[i]);heapify(arr,n,largest);}} 
    4. 排序综合

【题目描述】随机生成10000、20000、40000、80000、160000个整形数据,监测冒泡排序、选择排序、快速排序这三种排序方法各自所需要的时间,并显示其排序时间。可以将前面做过的其他排序方法加入,进行对比。

【说明】此题仅提交、不测评、不计分。

//希尔排序
//8 3 6 1 68 12 19 3 1 0
#include<iostream>
#include<ctime>
#include<bits/stdc++.h> 
using namespace std;void InsSort(int a[],int n)
{int j;for(int i=0;i<n-1;i++){int x=a[i+1];for(j=i;j>=0;j--){if(x<a[j]){a[j+1]=a[j];}else break;}a[j+1]=x;}
}void Shell(int a[],int n,int incr)
{int j;
for(int i=0;i+incr<n;i++)
{int x=a[i+incr];for( j=i;j>=0;j-=incr){if(x<a[j]) //18<10{a[j+incr]=a[j];}else break;}a[j+incr]=x;
}
}
void ShellSort(int a[],int n,int d[])
{for(int i=0;i<7;i++){Shell(a,n,d[i]);
//		for(int j=0;j<n;j++)
//			cout<<a[j]<<" ";}
}
int main()
{int a[200000],n=200000,i=0;int b[200000];srand(time(NULL));for(i=0;i<n;i++)b[i]=a[i]=rand();clock_t start,end;start=clock();int d[10]={79,11,7,5,3,1};//越多越快 ShellSort(a,n,d);end=clock();cout<<(double)(end-start)/CLOCKS_PER_SEC;start=clock();InsSort(b,n);end=clock();cout<<(double)(end-start)/CLOCKS_PER_SEC;} 


http://www.ppmy.cn/news/95923.html

相关文章

递归之谜:解析无限嵌套的美

一、前言 嵌套是指在一个事物中包含另一个事物&#xff0c;而递归是一种特殊形式的嵌套&#xff0c;其中一个事物包含自身。 递归就是一种嵌套的形式&#xff0c;递归函数解决问题时嵌套调用自身。递归的核心思想是通过反复应用相同的过程来解决问题&#xff0c;每一次调用都…

【python】pytorch包(第四章)手写数字图像识别

问题描述&#xff1a; 给定手写字体的图片&#xff0c;人工智能自动判断这是数字几 数据来源&#xff1a; MNIST数据集 代码实战&#xff1a; Part 1. 准备数据集 该模块内容完成的功能&#xff1a; 下载MNIST数据集&#xff1b;转换数据格式&#xff0c;使适用于pytorch&…

算法6.堆结构、堆排序、加强堆

算法|6.堆结构、堆排序、加强堆 1.比较器的定义 题意&#xff1a;定义一个学生类&#xff0c;分别实现对学生对象数组按年龄升序、按id降序、按名字的字典序、按id排序且id相同的年龄大的排在前边。 解题思路&#xff1a; 定义一个学生类定义一个实现了Comparator接口的类A…

C++ 学习 ::【基础篇:06】:C++ (inline)内联函数的介绍及其出现的意义【对比于 C语言宏函数】

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

Java中的String数据类型,String类(字符串)详解

目录 第一章、String概述1&#xff09;String是什么2&#xff09;String长什么样3&#xff09;String的构造方法(声明方式) 第二章、String类的详解1&#xff09;String底层是什么2&#xff09;字符串存储的内存原理/字符串常量池(String Constant Pool&#xff09;3&#xff0…

1. 从JDK源码级别彻底刨析JVM类加载机制

JVM性能调优 1. 类加载的运行全过程1.1 加载1.2 验证1.3 准备1.4 解析 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 课程内容: 1、从java.exe开始讲透Java类加载运行全过程 2、从JDK源码级别剖析JVM核…

科技的力量:致敬全国科技工作者

在这个日新月异的时代&#xff0c;科技的力量正在改变着我们的生活。为了庆祝5月30日的全国科技者工作日&#xff0c;我们特地上线本次创作活动&#xff0c;向所有为科技进步付出辛勤努力的科技工作者们致敬。在这篇博文中&#xff0c;我们将通过讲述科技发展的故事、分享技术成…

洛谷01背包变形(P1858多人背包)

多人背包 文章目录 一、问题简述二、问题分析三、代码参考 一、问题简述 DD 和好朋友们要去爬山啦&#xff01; 他们一共有 K 个人&#xff0c;每个人都会背一个包。这些包 的容量是相同的&#xff0c;都是 V。可以装进背包里的一共有 N 种物品&#xff0c;每种物品都有 给定…