排序算法总结源代码
更新时间:2023-05-24 22:26:01 阅读量: 实用文档 文档下载
这里罗列了很多的排序算法,希望对大家有用!
shell排序
#include <iostream>
using namespace std;
/*
shell排序是对插入排序的一个改装,它每次排序把序列的元素按照某个增量分成几个子序列,对这几
个子序列进行插入排序,然后不断的缩小增量扩大每个子序列的元素数量,直到增量为一的时候子序列
就和原先的待排列序列一样了,此时只需要做少量的比较和移动就可以完成对序列的排序了。
*/
template<typename T>
void ShellSort(T array[], int length)
{
T temp;
// 增量从数组长度的一半开始,每次减小一倍
for (int increment = length / 2; increment > 0; increment /= 2)
{
for (int indexI = increment; indexI < length; ++indexI)
{
temp = array[indexI];
}
} } // 对一组增量为increment的元素进行插入排序 int indexJ; for (indexJ = indexI; indexJ >= increment; indexJ -= increment) { // 把i之前大于array[i]的数据向后移动 if (temp < array[indexJ - increment]) { array[indexJ] = array[indexJ - increment]; } else { break; } } // 在合适位置安放当前元素 array[indexJ] = temp;
这里罗列了很多的排序算法,希望对大家有用!
int main()
{
int array[6] = {2, 8, 6, 7, 5, 4};
ShellSort(array, 6);
for (int index = 0; index != 6; ++index)
{
cout<<array[index]<<" ";
}
cout<<endl;
}
插入排序
#include <iostream>
using namespace std;
/*
插入排序是最简单最直观的排序算法了,它的依据是:遍历到第N个元素的时候前面的N-1个元素已经是排
序好的了,那么就查找前面的N-1个元素把这第N个元素放在合适的位置,如此下去直到遍历完序列的元素
为止算法的复杂度也是简单的,排序第一个需要1的复杂度,排序第二个需要2的复杂度,因此整个的复杂
度就是1 + 2 + 3 + …… + N = O(N ^ 2)的复杂度。
*/
template<typename T>
void InsertSort(T array[], int length)
{
T key;
for (int indexI = 1; indexI < length; ++indexI)
{
key = array[indexI];
// 把i之前大于array[i]的数据向后移动
int indexJ;
for (indexJ = indexI - 1; indexJ >= 0 && array[indexJ] > key; --indexJ)
{
array[indexJ + 1] = array[indexJ];
}
// 在合适位置安放当前元素
array[indexJ + 1] = key;
}
}
这里罗列了很多的排序算法,希望对大家有用!
int main()
{
int array[6] = {2, 8, 6, 7, 3, 4};
InsertSort(array, 6);
for (int index = 0; index != 6; ++index)
{
cout<<array[index]<<" ";
}
cout<<endl;
}
堆排序
#include <iostream>
using namespace std;
/*
1 堆排序
2 (1)用大根堆排序的基本思想
3 ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
4 ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换, 5 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
6 ③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。 7 然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换, 8 由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n- 2].keys≤R[n-1..n].keys,
9 同样要将R[1..n-2]调整为堆。
10 ……
11 直到无序区只有一个元素为止。
12 (2)大根堆排序算法的基本操作:
13 ① 初始化操作:将R[1..n]构造为初始堆;
14 ② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。
15 注意:
16 ①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。 17 ②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。
18 堆排序和直接选择排序相反:在任何时刻,堆排序中无序区总是在有序区之前, 19 且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。
20 */
void HeapAdjust(int SortData[],int StartIndex, int Length)
{
while(2*StartIndex+1 < Length)
这里罗列了很多的排序算法,希望对大家有用!
int MinChildrenIndex = 2*StartIndex+1 ; if(2*StartIndex+2 < Length ) { //比较左子树和右子树,记录最大值的Index if(SortData[2*StartIndex+1]<SortData[2*StartIndex+2]) { MinChildrenIndex = 2*StartIndex+2; } } if(SortData[StartIndex] < SortData[MinChildrenIndex]) { //交换i与MinChildrenIndex的数据 int tmpData =SortData[StartIndex]; SortData[StartIndex] =SortData[MinChildrenIndex]; SortData[MinChildrenIndex] =tmpData;
//堆被破坏,需要重新调整
StartIndex = MinChildrenIndex ;
}
else
{
//比较左右孩子均大则堆未破坏,不再需要调整
break;
}
}
return;
}
//堆排序
void HeapSortData(int SortData[], int Length)
{
int i=0;
//将Hr[0,Lenght-1]建成大根堆
for (i=Length/2-1; i>=0; i--)
{
HeapAdjust(SortData, i, Length);
}
for (i=Length-1; i>0; i--)
{
//与最后一个记录交换
int tmpData =SortData[0];
SortData[0] =SortData[i];
这里罗列了很多的排序算法,希望对大家有用!
SortData[i] =tmpData;
//将H.r[0..i]重新调整为大根堆
HeapAdjust(SortData, 0, i);
}
return;
}
int main()
{
int array[6] = {10, 15, 56, 25, 30, 70};
HeapSortData(array, 6);
for (int index = 0; index != 6; ++index)
{
cout<<array[index]<<" ";
}
cout<<endl;
}
归并排序
#include <iostream>
using namespace std;
/*
归并排序的算法思想:把待排序序列分成相同大小的两个部分,依次对这两部分进行归并排序,
完毕之后再按照顺序进行合并。
*/
// 归并排序中的合并算法
template<typename T>
void Merge(T array[], int start, int mid, int end)
{
T temp1[10], temp2[10];
int n1, n2;
n1 = mid - start + 1;
n2 = end - mid;
// 拷贝前半部分数组
for (int i = 0; i < n1; i++)
{
temp1[i] = array[start + i];
}
// 拷贝后半部分数组
这里罗列了很多的排序算法,希望对大家有用!
}
{ temp2[i] = array[mid + i + 1]; } // 把后面的元素设置的很大 temp1[n1] = temp2[n2] = 1000; // 逐个扫描两部分数组然后放到相应的位置去 for (int k = start, i = 0, j = 0; k <= end; k++) { if (temp1[i] <= temp2[j]) { array[k] = temp1[i]; i++; } else { array[k] = temp2[j]; j++; } }
// 归并排序
template<typename T>
void MergeSort(T array[], int start, int end)
{
if (start < end)
{
int nArea;
nArea = (end + start) / 2;
// 对前半部分进行排序 MergeSort(array, start, nArea);
// 对后半部分进行排序
MergeSort(array, nArea + 1, end);
// 合并前后两部分
Merge(array, start, nArea, end);
}
}
int main()
{
int array[6] = {2, 8, 6, 10, 5, 4};
MergeSort(array, 0, 5);
for (int index = 0; index != 6; ++index)
这里罗列了很多的排序算法,希望对大家有用!
}
cout<<array[index]<<" "; } cout<<endl;
快速排序
#include <iostream>
using namespace std;
/*
快速排序的算法思想: 选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢
纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。 */
template<typename T>
void Swap(T *a, T *b)
{
T temp;
temp = * a;
* a = * b;
* b = temp;
}
// 对一个给定范围的子序列选定一个枢纽元素,执行完函数之后返回分割元素所在的位置, // 在分割元素之前的元素都小于枢纽元素,在它后面的元素都大于这个元素
template<typename T>
int Partition(T array[], int low, int high)
{
// 采用子序列的第一个元素为枢纽元素 int pivot = array[low]; while (low < high) { // 从后往前在后半部分中寻找第一个小于枢纽元素的元素 while (low < high && array[high] >= pivot) { --high; } // 将这个比枢纽元素小的元素交换到前半部分 Swap(&array[low], &array[high]);
这里罗列了很多的排序算法,希望对大家有用!
}
} // 从前往后在前半部分中寻找第一个大于枢纽元素的元素 while (low < high && array[low] <= pivot) { ++low; } // 将这个比枢纽元素大的元素交换到后半部分 Swap(&array[low], &array[high]); // 返回枢纽元素所在的位置 return low;
// 快速排序
template<typename T>
void QuickSort(T array[], int low, int high)
{
if (low < high)
{
int n = Partition(array, low, high);
QuickSort(array, low, n);
QuickSort(array, n + 1, high);
}
}
int main()
{
int array[6] = {2, 8, 6, 7, 3, 4};
QuickSort(array, 0, 5);
for (int index = 0; index != 6; ++index)
{
cout<<array[index]<<" ";
}
cout<<endl;
}
冒泡排序
#include <iostream>
using namespace std;
template<typename T>
void Swap(T *a, T *b)
{
T temp;
这里罗列了很多的排序算法,希望对大家有用!
}
* a = * b; * b = temp;
// 冒泡排序
template<typename T>
void BubbleSort(T array[], int length)
{
//记录一次遍历中是否有元素的交换
for (int indexI = 0; indexI < length; ++indexI)
{
int indexJ;
for (int indexJ = indexI + 1; indexJ < length; ++indexJ)
{
if (array[indexJ] < array[indexI])
{
Swap(&array[indexJ], & array[indexI]);
}
}
}
}
int main()
{
int array[6] = {2, 8, 6, 9, 5, 4};
BubbleSort(array, 6);
for (int index = 0; index != 6; ++index)
{
cout<<array[index]<<" ";
}
cout<<endl;
}
选择排序
#include <iostream>
using namespace std;
/*
将序列划分为无序和有序区,寻找无序区中的最小值和无序区的首元素交换,有序区扩大一个,
循环最终完成全部排序。
这里罗列了很多的排序算法,希望对大家有用!
template<typename T>
void SelectSort(T array[], int length)
{
int indexI, indexJ, indexK;//分别为有序区,无序区,无序区最小元素指针
for (indexI = 0; indexI < length; ++indexI)
{
indexK = indexI;
for (indexJ = indexI + 1; indexJ < length; ++indexJ)
{
if (array[indexJ] < array[indexK])
{
indexK = indexJ;
}
}
if (indexK != indexI)//若发现最小元素,则移动到有序区
{
T temp = array[indexK];
array[indexK] = array[indexI];
array[indexI] = temp;
}
}
}
int main()
{
int array[6] = {2, 8, 6, 7, 3, 4};
SelectSort(array,6);
for (int index = 0; index != 6; ++index)
{
cout<<array[index]<<" ";
}
cout<<endl;
}
基数排序
如果有相同基数的数,判断存储该基数的结构体内的next指针是否为空,为空就分配空间,存储数据,不为空表明这里已经存储了一个相同基数的数,所以递归回去再判断...,如此依序形成一个具有相同基数的数据链;读取的时候则先判断指针是否存在,存在就读出其中的数据,再读下一个指针...一直到指针为空,说明该数据链上的数据已全部读出,再取下一个数组元素...
正在阅读:
排序算法总结源代码05-24
资料(建筑材料送样要求)07-22
2020浪漫婚礼主持词范文04-30
《VB程序设计》实验报告11-14
班主任综合评语【优秀7篇】03-22
心的交流 爱的天空12-31
2022年安徽高考363分能报什么大学 363分能上哪些院校03-29
2012上半年党风廉政建设工作总结09-06
关于兰溪市质量强市工作领导小组工作规则06-12
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 源代码
- 算法
- 排序
- 总结
- 环境法律、法规及其他要求一览表
- 沪教版九年级化学中考总复习
- 北师大版小学一年级语文下册期中试卷WORD春季
- GJB9001B质量管理体系审核检查表
- 2010第二次临时股东大会法律意见书
- 2013建筑给水排水(含民用+工业)-经典审图意见汇总
- 益阳市2021版三年级上学期语文期中考试模拟试卷D卷
- 形位公差国家标准
- 2015政法干警面试热点解读:义务劳动报道“淡化领导”好
- 现代抗震设计理论的发展过程
- 无机材料科学基础(第二章)xiugai
- 鞠允平在全市教师资格定期注册工作动员培训会议上的讲话
- 人教版七年级下册课外古诗词默写练习
- 中学2019上半年语文教研组工作总结
- 高中选修课备课资料
- Section B (3a-self-check)
- 待机、休眠、睡眠的区别和优缺点
- 防寒防冻管理规定
- 景观设计说明集1
- 2013年中国网络购物网站排行榜