先按照王道系列的伪代码,写了一下常见的排序算法。代码先放这儿,先不做算法分析,回头再来分析消化。

// 排序算法.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++实现的更多相关文章

  1. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  4. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  5. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  6. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  7. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  8. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  9. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

  10. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

随机推荐

  1. redis 高可用

    Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实 ...

  2. HIT2019春软件构造->Git&Github学习笔记

    由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作  1.基本信息设置(设置签名)  命令        项目级别/仓库级别:仅在当前本地库范围内有效 git ...

  3. 网络爬虫&起点中文网完本榜500部小说

    # 网络爬虫爬取起点中文网完本榜小说500部# 四步,分步操作,不易出错# 所需要获取的数据:书名 .作者.网址.类型.主要介绍.作品信息 from urllib.request import * # ...

  4. Json 数组传值

    1. var _content = {}; _content[_title] = _oldValue + ' -- > ' + statusVal; 2. var eventData = { T ...

  5. 15、TypeScript-函数

    1.参数和返回值可以指定类型 2.可选参数:在参数上加上?,表示可选的,可传可不传 3.默认参数:如果你不传参数,默认为20,如果你传参,就是你传的参数 4.剩余参数:会把传进来的实参变成一个数组,可 ...

  6. 正则--test exec search match replace

    1:test 是正则对象的方法不是字符串的方法,使用例子:正则对象也就是那个设定好的模式对象 var str = "hello world!"; var result = /^he ...

  7. .NET反射简单应用———遍历枚举字段

    反射(Reflection)是一个非常强大的工具,可以用来查看和遍历类型和类型成员的元数据:动态创建类型实例,动态调用所创建的实例方法.字段.属性:迟绑定方法和属性.此次要介绍的是使用反射查看类型成员 ...

  8. SharePoint附加内容数据库时报错

    今天遇到一个很奇怪的问题,在sharepoint管理中心中给web application添加内容数据库时报错:The SharePoint database named WSS Content al ...

  9. python第三方库------jieba库(中文分词)

    jieba“结巴”中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点支持三种分词模式: 精确模式,试图将句子最精确地切开, ...

  10. Android直接用手机打包apk!

      你没有看错,用手机浏览器访问Jenkins,就可以打包apk,并生成下载二维码,发送邮件通知测试人员下载,从此解放双手,告别打包测试.先上本人手机邮箱收到的打包成功通知效果图:     废话少说, ...