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

// 排序算法.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. java中,字符串和集合判断是否为空

    字符串: 集合: 不为空

  2. 使用cookie保存用户名和密码

    效果图如下 从数据库中随意使用一个账号登录 登陆成功来到人中心 返回登录界面 实现代码如下 package com.test.controller; import java.io.IOExceptio ...

  3. Loadrunner11中webservice协议脚本总结

    Loadrunner11中webservice协议脚本总结 简介     webservices协议是建立可交互操作的分布式应用程序的新平台,它通过一系列的标准和协议来保证程序之间的动态连接,其中最基 ...

  4. lxml 解析字符处理规则

    规则1:无论输入的字符串是何种状态,lxml包接收后一律转换成unicode,其处理结果也是unicodetype,输出到文件时,需要指定编码,转换成特定的stringtype状态.规则2:lxml用 ...

  5. Python3+unittest使用教程

    一.直接使用TestCase 注意所有测试方法都需要以test开头.代码如下: import unittest class Test1(unittest.TestCase): @classmethod ...

  6. 在Linux和Windows之间的远程控制的实现

    主要开发工作用Linux,邮件和文档等主要在Windows,两者之间经常需要传输数据,两台主机都必须同时运行着. 但是,通常来说,它们需要同时准备两套显示器.鼠标和键盘,既占地方又不够方便. 远程控制 ...

  7. shell脚本学习之实例列举

    1.用shell写一个从1加到100的程序: 方法一: #!/bin/bashsum=0for i in {1..100}do   let sum+=$idone   echo $sum 方法二: # ...

  8. SpringBoot 下 mybatis 的缓存

    背景: 说起 mybatis,作为 Java 程序员应该是无人不知,它是常用的数据库访问框架.与 Spring 和 Struts 组成了 Java Web 开发的三剑客--- SSM.当然随着 Spr ...

  9. freemarker导出word档

    1.word另存为xml:2.xml文件后缀名改成ftl:3.编写完整json字符串备用:4.修改ftl中动态字段为json中对应字段名:5.编写java代码自动生成word文件:(注意:换行用< ...

  10. [BZOJ1596]电话网络

    Problem 给你一棵树,可以在每个点上选择造塔或不造,每座塔可以覆盖这个节点和相邻节点,问覆盖整棵树的最小塔数. Solution 看到这道题的第一眼,我就觉得是一题贪心题,但看见出题的时候分类在 ...