美文网首页
排序算法

排序算法

作者: wuyuek | 来源:发表于2018-09-23 21:40 被阅读0次

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

/*

*冒泡

*从未排序序列首元素开始,依次与相邻元素进行比较,将较小的放在前面

**/

void bubble(vector<int> &m)

{

int len = m.size();

for (int i = 0; i < len;i++)

{

for (int j = i;j < len;j++)

{

if (m[i] > m[j])

{

swap(m[i],m[j]);

}

}

}

}

/*

*选择

*选择序列中最小元素放在已排序部分,在未排序序列中再选择次小的放入已排序序列后

**/

void selectsort(vector<int>&m)

{

int len = m.size();

for (int i = 0;i < len -1;i++)

{

int x = i;

for (int j = i+1;j < len;j++)

{

if (m[x] > m[j])

{

x = j;

}

}

if(x != i)

swap(m[x],m[i]);

}

}

/*

*快速

*在序列中选择一个元素,一般以起始元素作为基准,把所有比该值小的放左边,比该值大的放右边,以此递归

**/

void quick(vector<int>&m,int start,int end)

{

int i = start;

int j = end;

int x = m[i];

if(start >= end)

return;

while(i != j)

{

while(i < j && m[j] >= x)

j--;

if(i < j)

m[i] = m[j];

while(i < j && m[i] <= x)

i++;

if(i < j)

m[j] = m[i]; 

}

m[i] = x;

quick(m,start,i-1);

quick(m,i+1,end);

}

/*

*插入

*从第一个元素开始,该元素可被认为是已经被排序,取出下一个元素,在已经排序好的元素中从后向前扫描,如果已经排序元素大于新元素,将已排序元素移到下一个位置

*重复上述步骤,直到找到已排序的元素小于或者等于新元素的位置,新元素插入到该位置后

**/

void insert(vector<int>&m)

{

int len = m.size();

for(int i = 1;i < len;i++)//未排序

{

int get = m[i];

int j = i - 1;

while(j >= 0 && m[j] > get)

{

m[j+1] = m[j];

j--;

}

m[j+1] = get;//找到了,进行插入

}

}

/*

*希尔排序

*插入排序改进版,增大插入步伐

**/

void hillsort(vector<int>&m)

{

int len = m.size();

int h = 0;

while(h < len)

{

h = h * 3 + 1;

}

while(h >= 1)

{

for(int i = h;i < len;i++)

{

int j = i - h;

int get = m[i];

while(j >= 0 && m[j] > get)

{

m[j+h] = m[j];

j = j - h;

}

m[j+h] = get;

}

h = (h - 1) / 3;

}

}

/*

*归并排序

*将两个已排序的子序列合并为一个序列

**/

void merge(vector<int>&m,int left,int mid,int right)

{

int len = right - left + 1;

int * temp = new int[len];

int index = 0;

int i = left;

int j = mid + 1;

while( i <= mid && j <= right)

temp[index++] = (m[i] <= m[j]) ? m[i++] : m[j++];

while(i <= mid)

temp[index++] = m[i++];

while(j <= right)

temp[index++] = m[j++];

for (int i = 0;i < len;i++)

{

m[left++] = temp[i];

}

}

void mergesort(vector<int> &m,int left,int right)

{

if (left == right)

{

return;

}

int mid = (left + right) / 2;

mergesort(m,left,mid);

mergesort(m,mid+1,right);

merge(m,left,mid,right);

}

/*

*堆排序

*构造大顶堆,作为初始无序区

**/

void swap(vector<int> &m,int i,int j)

{

int temp = m[i];

m[i] = m[j];

m[j] = temp;

}

void adjustheap(vector<int> &m,int i, int size)

{

int temp = m[i];//先取出当前元素

for (int k = i * 2 + 1;k < size;k = k * 2 + 1)//从i节点的左子节点开始,也就是2*i+1处开始

{

if(k+1 < size && m[k] < m[k+1])//如果左子节点小于右子节点,k指向右子节点

k++;

if (m[k] > temp)//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)

{

m[i] = m[k];

i = k;

}

else

break;

}

m[i] = temp;//将temp值放到最终的位置

}

void heapsort(vector<int> &m)

{

for (int j = m.size() / 2 - 1;j >= 0;j--)//构造大顶堆

{

adjustheap(m,j,m.size());//从第一个非叶子节点从下至上,从右至左调整结构

}

for (int i = m.size() - 1;i > 0;i--)//调整元素,交换元素

{

swap(m,0,i);

adjustheap(m,0,i);

}

}

int main()

{

vector<int>m;

m.push_back(2);

m.push_back(4);

m.push_back(1);

m.push_back(7);

m.push_back(0);

m.push_back(5);

//bubble(m);

//selectsort(m);

//quick(m,0,m.size()-1);

//insert(m);

//mergesort(m,0,m.size()-1);

heapsort(m);

for (int i = 0;i < m.size();i++)

{

cout<<m[i];

}

cout<<endl;

return 0;

}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:排序算法

      本文链接:https://www.haomeiwen.com/subject/briqoftx.html