排序算法

2018-09-23  本文已影响0人  wuyuek

#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;

}

上一篇 下一篇

猜你喜欢

热点阅读