数据结构之排序技术:快速排序、归并排序、堆排序(C++版)
2024-09-02 23:32:09
快速排序
#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
最新文章
- win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法
- Asp.Net_<;%%>;模式常用语法
- [DFNews] Cellebrite UFED系列更新, 支持IOS7
- 使用Enitity Framework实现增删改查服务中的一些通用思路
- IIS搭建本地服务器,花生壳实现外网通过域名访问网站
- IOS开发--上传图片
- Error parsing XML: not well-formed (invalid token)
- leetcode Trapping Rain Water pthon
- ssh的public key的使用
- Android中查看布局文件中的控件(view,id)在哪里被调用(使用)
- MyBatis 批量操作、集合遍历-foreach
- c++ 如何获取多线程的返回值?
- win10搭建svn服务
- [精华][推荐]CAS SSO实现单点登录框架学习源码
- Ioc及Bean容器(三)
- 前端基础-- CSS
- BroadcastReceiver插件化解决方案
- SQLSERVER性能调优小技巧
- 查看值是否传过来php
- Logging模块 + traceback模块 + importlib模块 + requests模块