排序算法C++实现
先按照王道系列的伪代码,写了一下常见的排序算法。代码先放这儿,先不做算法分析,回头再来分析消化。
// 排序算法.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
//插入排序——直接插入排序
void InsertSort(vector<int>&vctArray)
{
if (vctArray.size() <= )
return;
int i, j, tmp;
for ( i = ; i < vctArray.size(); ++i)
{
if (vctArray[i] < vctArray[i - ])
{
tmp = vctArray[i];
for ( j = i-; j >= && tmp<vctArray[j]; --j)
vctArray[j + ] = vctArray[j];
vctArray[j+] = tmp;
}
}
}
//插入排序——折半插入排序(算法复杂度:仅仅改变比较次数,移动次数仍然不变)
void HalfInsertSort(vector<int>&vctArray)
{
if (vctArray.size() <= )
return;
int i, j, tmp;
for (i = ; i < vctArray.size(); ++i)
{
if (vctArray[i] < vctArray[i - ])
{
int begin = , end = i - , mid;
tmp = vctArray[i];
while (begin<=end)
{
mid = (begin + end) / ;
if (vctArray[mid] > tmp)
end = mid -= ;
else
begin = mid + ;
}
for (j = i - ; j >end; --j)
vctArray[j + ] = vctArray[j];
vctArray[end+] = tmp;
}
}
}
//插入排序——希尔排序
void ShellSort(vector<int>&vctArray)
{
int dk,i,j,tmp;
for (dk = vctArray.size() / ; dk >= ; dk = dk / )
{
for (i = dk + ; i < vctArray.size(); ++i)
{
if (vctArray[i] < vctArray[i - dk])
{
tmp = vctArray[i];
for (j = i - dk; j >= && vctArray[j] > tmp; j -= dk)
vctArray[j + dk] = vctArray[j];
vctArray[j + dk] = tmp;
}
}
}
}
//交换排序——冒泡排序
void BubbleSort(vector<int>& vctArray)
{
int i, j, tmp;
bool flag = true;
for (i = ; i < vctArray.size()&&flag; ++i)
{
flag = false;
for (j = vctArray.size() - ; j > i; --j)
{
if (vctArray[j] < vctArray[j - ])
{
tmp = vctArray[j - ];
vctArray[j - ] = vctArray[j];
vctArray[j] = tmp;
flag = true;
}
}
}
}
//交换排序——快速排序
int Partition(vector<int>&vctArray, int low, int high);
void QuickSort(vector<int>& vctArray,int low,int high)
{
if (low < high)
{
int mid=Partition(vctArray,low,high);
QuickSort(vctArray,low, mid - );
QuickSort(vctArray, mid + ,high);
}
}
int Partition(vector<int>&vctArray, int low, int high)
{
int pivot=vctArray[low];
while (low < high)
{
while (low < high&&vctArray[high] >= pivot)
--high;
vctArray[low] = vctArray[high];
while (low < high&&vctArray[low] <= pivot)
++low;
vctArray[high] = vctArray[low];
}
vctArray[low] = pivot;
return low;
} //选择排序——简单排序
void SelectSort(vector<int>& vctArray)
{
int minIndex = -;
for (int i = ; i < vctArray.size()-; ++i)
{
minIndex = i;
for (int j = i + ; j < vctArray.size(); ++j)
{
if (vctArray[j] < vctArray[minIndex])
minIndex = j;
}
if (minIndex != i)
{
int tmp = vctArray[minIndex];
vctArray[minIndex] = vctArray[i];
vctArray[i] = tmp;
}
}
}
//选择排序——堆排序
void BuildMaxHeap(vector<int>&vctArray, int len);
void AdjustDown(vector<int>&vctArray,int k,int len);
void MaxHeapSort(vector<int>& vctArray)
{
BuildMaxHeap(vctArray,vctArray.size()-);
for (int i = vctArray.size()-; i >=; --i)
{
vctArray[] = vctArray[];
vctArray[] = vctArray[i];
vctArray[i] = vctArray[];
AdjustDown(vctArray,,i-);
}
}
void BuildMaxHeap(vector<int>&vctArray,int len)
{
for (int i = len / ; i > ; --i)
AdjustDown(vctArray,i,len);
}
void AdjustDown(vector<int>&vctArray,int k,int len)
{
vctArray[] = vctArray[k];
for (int i = * k; i <= len; i*=)
{
if (i < len&& vctArray[i] < vctArray[i + ])
++i;
if (vctArray[] >= vctArray[i])
break;
else
{
vctArray[k] = vctArray[i];
k = i;
}
}
vctArray[k]= vctArray[];
}
//归并排序
void Merge(vector<int>&vctArray, int low, int mid, int high);
void MergeSort(vector<int>&vctArray, int low, int high)
{
if (low < high)
{
int mid = (low + high) / ;
MergeSort(vctArray,low,mid);
MergeSort(vctArray,mid+,high);
Merge(vctArray,low,mid,high);
}
}
void Merge(vector<int>&vctArray, int low, int mid, int high)
{
vector<int> vctTmp = vctArray;
int i, j, k;
for (i = low, j = mid + , k = i; i <= mid&&j <= high; ++k)
{
if (vctTmp[i] <= vctTmp[j])
vctArray[k] = vctTmp[i++];
else
vctArray[k] = vctTmp[j++];
}
while (i<=mid)
vctArray[k++] = vctTmp[i++];
while (j <= high)
vctArray[k++] = vctTmp[j++];
} void PrintArray(vector<int>& vctArray,int k)
{
for (int i = k; i < vctArray.size(); ++i)
{
cout << vctArray[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> vctArray = { ,,,,,,,,,, };
// vector<int> vctArray = { 3,6,1,8,3,6,2,8,4,5,9 };
vector<int> tmpArray = vctArray;
cout << endl;
cout << "..........插入排序——直接插入排序..........." << endl;
cout << "排序前:";
PrintArray(vctArray,);
InsertSort(vctArray);
cout << "排序后:";
PrintArray(vctArray, ); cout << endl;
vctArray = tmpArray;
cout << endl; cout << "..........插入排序——折半插入排序..........." << endl;
cout << "排序前:";
PrintArray(vctArray, );
InsertSort(vctArray);
cout << "排序后:";
PrintArray(vctArray, ); cout << endl;
vctArray = tmpArray;
cout << endl; cout << "............插入排序——希尔排序............." << endl;
cout << "排序前:";
PrintArray(vctArray, );
ShellSort(vctArray);
cout << "排序后:";
PrintArray(vctArray, ); cout << endl;
vctArray = tmpArray;
cout << endl; cout << "............交换排序——冒泡排序............." << endl;
cout << "排序前:";
PrintArray(vctArray, );
BubbleSort(vctArray);
cout << "排序后:";
PrintArray(vctArray, ); cout << endl;
vctArray = tmpArray;
cout << endl; cout << "............交换排序——快速排序............." << endl;
cout << "排序前:";
PrintArray(vctArray, );
QuickSort(vctArray,,vctArray.size()-);
cout << "排序后:";
PrintArray(vctArray, ); cout << endl;
vctArray = tmpArray;
cout << endl; cout << "..........选择排序——简单选择排序..........." << endl;
cout << "排序前:";
PrintArray(vctArray, );
SelectSort(vctArray);
cout << "排序后:";
PrintArray(vctArray, ); cout << endl;
vctArray = tmpArray;
cout << endl; cout << ".............选择排序——最大堆排序..........." << endl;
cout << "排序前:";
PrintArray(vctArray, );
//为了方便操作,从1开始存放元素,即下标1为跟节点,将第0个元素设为哨兵
vctArray.push_back(vctArray[]);
MaxHeapSort(vctArray);
cout << "排序后:";
PrintArray(vctArray, ); cout << endl;
vctArray = tmpArray;
cout << endl; cout << "...................归并排序...................." << endl;
cout << "排序前:";
PrintArray(vctArray, );
MergeSort(vctArray,,vctArray.size()-);
cout << "排序后:";
PrintArray(vctArray, );
cout << endl; return ;
}
排序算法C++实现的更多相关文章
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- 用Java来写常见的排序算法
随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
- 排序算法总结第二弹----冒泡排序---javascript描述
上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...
- 排序算法总结------选择排序 ---javascript描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
随机推荐
- 大数据分析-excel常用技巧
在用EXCEL制表时,经常要要用到填充,比如1到100行内容相同或引用公式,大多数人会用鼠标拖来拖去,例如: 在第一行的A1单元格右下方 鼠标指针 变 实心黑十字 向下拉或向右,向左拉 我想拉100行 ...
- 控制dom 加载成功后事件
- javascript高级程序设计第3版——第10章 DOM
第十章,DOM DOM是语言中立的API,用于访问和操作HTML 和XML 文档.DOM1 级将HTML 和XML 文档形象地看作一个层次化的节点树,可以使用JavaScript 来操作这个节点树,进 ...
- boost库中的 program_options
1.阅读rviz中的源码时在rviz/visualizer_app.cpp中遇到如下代码: po::options_description options; options.add_options() ...
- js给图层添加动态样式
需求:需要在视窗内随意点击对应位置,图层从上到下匀速运动到指定位置 html <img id="moveDot" class="moveDot" src= ...
- hdu6395 (矩阵快速幂+分块)
Online Judge Online Exercise Online Teaching Online Contests Exercise Author F.A.Q Hand In Hand Onli ...
- Qt 滚动窗口类
{ QScrollArea *scrollArea = new QScrollArea(this); scrollArea->setFrameStyle(); scrollArea->se ...
- UVa 11389 - The Bus Driver Problem 难度:0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- prerender-spa-plugin Vue预渲染配合meta-info优化seo
记录一下解决方案的过程 先安装prerender和puppeteer插件 这个国外大神写的 github地址就不附上了(百度有) cnpm install prerender-spa-plugin ...
- Django:同一个app支持多个数据库
我以我个人的Mynote工程说明,目的是要在backend这个app里面设置不同的model对应daysn和bear两个数据库进行操作 现在我们先简单对一个完全新建的django工程配置一个自动在my ...