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

// 排序算法.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. Notepad++编译和运行C语言 (GCC)

    我们在学习C语言的时候,实际上只需要编译器和编辑器就能开搞了.(初学者过早接触IDE不利于理解程序构建的过程) 在看这篇文章的时候,假设你已经知道如何把GCC配置到环境变量,并且会在命令行/终端下使用 ...

  2. SAP基础:定位点运算

    先看一下下面简单的代码: REPORT zlytest003. ) VALUE '21.00'. ) . b = a. WRITE b. 运行结果是: 这时候到程序属性页面: 修改固定点算术为空. 保 ...

  3. Chrome的Copy Selector中带有\3

    F12,右键copy selector就是这个结果. 查询到如下资料: https://stackoverflow.com/questions/20043347/css-css-coding-that ...

  4. 爬虫(二)Python网络爬虫相关基础概念、爬取get请求的页面数据

    什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫    1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆 ...

  5. 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  6. 利用IIS部署WEB网站以及解决CSS/JS不能显示问题

    利用IIS部署WEB网站以及解决CSS/JS不能显示问题 转载声明:http://blog.sina.com.cn/s/blog_a001e5980101b4kt.html vs中正常IIS发布网站后 ...

  7. MySQL运用

    进入mysql 命令行: mysql -uroot -p查看所有数据库: show databases;创建数据库: create database niu charset utf8;删除数据库: d ...

  8. 如何推进企业流程体系建设?_K2 BPM

    推进全集团统一的流程体系为什么比想象的难? 很多企业在推进全集团的流程管理过程中,经常会有一种“望山跑死马”的感觉.“各成员公司都建立起与集团公司统一的流程管理体系”,看似很简单一件事情,但没有经过良 ...

  9. leetcode python 037 求解数独

    import numpy as npimport syssys.setrecursionlimit(1000) #例如这里设置为一百万 def get1(n):    if n<3:       ...

  10. Android四大组件之Service --- 如何启动和停止Service?

    启动和停止方法主要是通过Intent来实现 以上一篇中的ServiceTest项目为例来启动和停止MyService这个服务 首先修改activity_main.xml中的代码,如下所示:<Li ...