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

// 排序算法.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. angular 引入编辑器以及控制器的学习和理解。。。

    在angular中引入编辑器的时候花了很长时间,然后发现自己以前根本就没好好用过angular,因为项目是接手的学姐的,学姐又是接手的学姐的,到我这里就只是写写页面的事了. 引入编辑器差了好多好多资料 ...

  2. RuntimeError: Model class app_anme.models.User doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.---python学习错误记录

    untimeError: Model class app_anme.models.User doesn't declare an explicit app_label and isn't in an ...

  3. java接口特性

    java接口特性 (1)接口可以被实例化 ,常作为类型使用 (2)实现类必须实现接口的所有方法 ,抽象类除外 (3)实现类可以实现多个几口   java中的多继承 (4)接口中的变量都是静态变量

  4. jieba 库

    jieba库是python 一个重要的第三方中文分词函数库,但需要用户自行安装. 一.jieba 库简介 (1) jieba 库的分词原理是利用一个中文词库,将待分词的内容与分词词库进行比对,通过图结 ...

  5. python之路-----前端之http协议

    一.概述 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则(B/S架构). HTTP就是一个基于TCP的 ...

  6. python简介和python工具的选择

    Python 简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有 ...

  7. 常见类 Object

    1.在Java类继承结构中Java.lang.Object类位于顶端 2.如果定义一个Object类没有使用extends关键字声明其父类,则其父类为Java.lang.Object类 3.Objec ...

  8. Linux配置JDK、Tomcat和Mysql免安装版

    现在已有JDK.Tomcat和mysql的tar.gz压缩文件 1.解压文件 (1)解压tar.gz tar -zxvf 待解压文件名 -C 解压到目标文件目录 (2)解压zip unzip 待解压文 ...

  9. 最新的 cocoapods 安装与使用(2019.04)

    cocoapods简介: cocoapods 是iOS的类库管理工具,可以让开发者很方便集成各种第三方库,而不用去网站上一个个下载,再一个个文件夹的拖进项目中,还得添加相关的系统依赖库.只需要安装好c ...

  10. EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】

    前言 α角 与 β角 关于α角 与 β角的介绍,请见上文 如何用EFCore Lazy Loading实现Entity Split. 本篇会继续有关于β角的彩蛋在等着大家去发掘./斜眼笑 其他 本篇的 ...