数据结构之排序技术:快速排序、归并排序、堆排序(C++版)
快速排序
#include <iostream>
using namespace std; void swap(int num[], int i, int j)
{
int temp = num[i];
num[i] = num[j];
num[j] = temp;
} int partition(int num[], int left, int right)
{
int key = left;
int value = num[key];
while (left < right)
{
while (left < right && num[right] >= value)right--;
while (left < right && num[left] <= value)left++;
swap(num, right, left);
}
swap(num, key, left);
return left;
} void QuickSort(int num[], int begin, int end)
{
if (begin < end)
{
int middle = partition(num, begin, end);
QuickSort(num, begin, middle - );
QuickSort(num, middle + , end);
}
} int main()
{
int num[];
int n = ;
while (cin >> n)
{
for (int i = ; i < n; i++)
{
int temp = ;
cin >> temp;
num[i] = temp;
}
QuickSort(num, , n - );
for (int i = ; i < n; i++)
cout << num[i] << " ";
cout << endl;
}
return ;
}
归并排序
#include <iostream>
using namespace std; void Merge(int *from, int *to, int begin, int middle, int end)
{
int i = begin;
int j = middle + ;
int k = i;
while (i <= middle && j <= end)
{
if (from[i] < from[j])
to[k++] = from[i++];
else to[k++] = from[j++];
}
while (i <= middle) to[k++] = from[i++];
while (j <= end) to[k++] = from[j++];
} void MergePass(int *from, int *to, int end, int h)
{
int i = ;
while (i <= end - * h + )
{
Merge(from, to, i, i + h - , i + * h - );
i += * h;
}
if (i < end - h + )
Merge(from, to, i, i + h - , end);
else
for (int k = i; k <= end; k++)
{
to[k] = from[k];
}
} void MergeSort(int *from, int *to, int begin, int end)
{
int h = ;
while (h <= end)
{
MergePass(from, to, end, h);
h = * h;
MergePass(to, from, end, h);
h = * h;
}
} int main() {
int num[];
int num2[];
int n = ;
while (cin >> n)
{
for (int i = ; i < n; i++)
{
int temp = ;
cin >> temp;
num[i] = temp;
}
MergeSort(num, num2, , n - );
for (int i = ; i < n; i++)
cout << num[i] << " ";
cout << endl;
}
return ;
}
堆排序
#include <stdio.h> void HeapAdjust(int *num, int s, int length)
{
int temp = num[s];
int child = * s + ;
while (child < length)
{
if (child + < length && num[child] < num[child + ])
child++;
if (num[s] < num[child])
{
num[s] = num[child];
num[child] = temp;
s = child;
child = * s + ;
}
else
break;
}
} void buildingHeap(int *num, int length)
{
for (int i = (length - ) / ; i >= ; --i)
HeapAdjust(num, i, length);
} void HeapSort(int *num, int length)
{
buildingHeap(num, length);
for (int i = length - ; i > ; --i)
{
int temp = num[];
num[] = num[i];
num[i] = temp;
HeapAdjust(num, , i);
}
} void print(int num[], int n) {
for (int i = ; i < n; i++) {
printf("%d ", num[i]);
}
printf("\n");
} int main()
{
int num[];
int n = ;
while (scanf("%d", &n) != EOF)
{
for (int i = ; i < n; i++)
scanf("%d", &num[i]);
HeapSort(num, n);
print(num, n);
}
return ;
}
转自:http://www.cnblogs.com/renjiashuo/p/7412583.html
数据结构之排序技术:快速排序、归并排序、堆排序(C++版)的更多相关文章
- 【Java】 大话数据结构(16) 排序算法(3) (堆排序)
本文根据<大话数据结构>一书,实现了Java版的堆排序. 更多:数据结构与算法合集 基本概念 堆排序种的堆指的是数据结构中的堆,而不是内存模型中的堆. 堆:可以看成一棵完全二叉树,每个结点 ...
- HDU-1425-sort(计数排序以及快速排序和堆排序的变种)
计数排序 Accepted 1425 483MS 5276K 997 B G++ #include "bits/stdc++.h" using namespace std; typ ...
- c语言 快速排序---归并排序----堆排序
//快速排序: #include <stdio.h> #define MAX 500000 int s[MAX]; void Q_Sort(int start,int end) { int ...
- Java数据结构与排序算法——堆和堆排序
//================================================= // File Name : Heap_demo //--------------------- ...
- 算法 排序NB二人组 堆排序 归并排序
参考博客:基于python的七种经典排序算法 常用排序算法总结(一) 序前传 - 树与二叉树 树是一种很常见的非线性的数据结构,称为树形结构,简称树.所谓数据结构就是一组数据的集合连同它们的储 ...
- <算法基础><排序>三种高级排序——快速排序,堆排序,归并排序
这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(n ...
- Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)
目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...
- 数据结构和算法(Golang实现)(25)排序算法-快速排序
快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...
- 数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序
优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉 ...
随机推荐
- sencha touch list infinite 属性
sencha touch list 1 默认每一项的高度会自动适应其内容. 2 当每一个 item 的高度都相同且不变时, 设置 itemHeight 为固定值 和 variableHeights 为 ...
- 更好的理解MVC
mvc除了将数据层和逻辑层分离外,还有更好的优化了代码结构 m只和c交互,v也只和c交互,m与v的交互需要通过c,一共只用考虑4条路 如果不是这样的话,m v c需要考虑和每个人交互,那么就是要考虑 ...
- Nginx的Permission denied错误
Nginx的Permission denied错误 环境: CentOS7 问题描述 今天搭建了nginx+uwsgi+django的环境,之后通过浏览器访问遇到下面问题: 2017/03/31 19 ...
- git 自己创建了一个项目A,我的同事fork一个B,当我的项目更新的时候,怎么样在他fork的repo上进行相应的更新?
先把B clone到本地 git clone B_REPOSITORY_URL 再cd到本地B的目录,把A作为一个remote加到本地的B中(一般命名为upstream) git remote add ...
- [转]How to use an Area in ASP.NET Core
本文转自:http://stackoverflow.com/questions/36535511/how-to-use-an-area-in-asp-net-core Q: How does one ...
- jquery 使用整理
1. 如何创建嵌套的过滤器 //允许你减少集合中的匹配元素的过滤器, //只剩下那些与给定的选择器匹配的部分.在这种情况下, //查询删除了任何没(:not)有(:has) //包含class为“se ...
- Orchard源码分析 - 缓存管理
ICacheManager & ICacheHolder Orchard缓存管理主要通过 ICacheManager 接口对外提供缓存服务. 其实现类D ...
- Windows Server: 将虚拟机迁移到 Azure (以阿里云为例)
Azure 虚拟机能很容易地导出 vhd 并迁移到各种环境中,包含本地及云端环境,或者迁移至其他区域.这为开发.测试.扩展带来了极大的便利.本文以阿里云为例,阐述如何将Windows Server 的 ...
- WPF画箭头
简介 参考Using WPF to Visualize a Graph with Circular Dependencies的基础上写了一个WPF画箭头的库. 效果图如下: 使用的XAML代码如下: ...
- docker 安装ElasticSearch head
github官网地址 https://github.com/mobz/elasticsearch-head 拉取镜像 docker pull mobz/elasticsearch-head:5 创建容 ...