冒泡排序、选择排序、插入排序、归并排序、快速排序 C++程序

分为三个文件:

_sort.h,_sort.cpp,main.cpp

//_sort.h

#pragma once
#include<vector>
using namespace std;

void Bubble_sort(vector<int> vec);
void Selection_sort(vector<int> vec);
void Insertion_sort(vector<int> vec);

void Guibing_sort(vector<int> vec);
void Quick_sort(vector<int> vec);
//_sort.cpp

#include "_sort.h"
#include<iostream>

//冒泡排序:两两比较,将大值向后排列
void Bubble_sort(vector<int> vec)
{
	int len = vec.size();
	for (int i=0;i!=len-1;i++)       //第一层循环:控制循环次数
	{
		for (int j = 0; j != len-1; j++)  //第二次循环:排序
		{
			if (vec[j] > vec[j + 1])
			{
				int temp = vec[j];
				vec[j] = vec[j + 1];
				vec[j + 1] = temp;
			}
		}
	}
	for (int k = 0; k != len; k++)
	{
		cout << vec[k] << " ";
	}
}


//选择排序
void Selection_sort(vector<int> vec)
{
	int len = vec.size();
	for (int i = 0; i != len ; i++)       //第一层循环:控制循环次数
	{
		int index=0;
		for (int j = 0; j != len -i; j++)  //循环,寻找最大值
		{
			if (vec[j] > vec[index])
			{
				index = j;
			}
		}
		int temp = vec[len - 1 - i];
		vec[len - 1 - i] = vec[index];
		vec[index] = temp;
	}
	for (int k = 0; k != len; k++)
	{
		cout << vec[k] << " ";
	}
}

//插入排序
void Insertion_sort(vector<int> vec)
{
	int len = vec.size();
	for (int i = 1; i != len; i++)    //外循环控制循环次数
	{
		int value = vec[i];
		for (int j = i-1; j >=0; j--)  //内循环前i个数据排序
		{								//注意:前一项大于此处数值时,便移位;但是,前一项小于此数值时,此时的位置为该数值,且应该跳出循环,进行下一数值的排序
			if (vec[j] > value)
				vec[j + 1] = vec[j];
			else
			{
				vec[j + 1] = value; 
				break;
			}		
		}
	}
	for (int k = 0; k != len; k++)
	{
		cout << vec[k] << " ";
	}
}

//归并排序
void merge(vector<int> &vec, int begin, int mid, int end);
void G_sort(vector<int> &vec, int begin, int end);
void Guibing_sort(vector<int> vec)
{
	G_sort(vec,0,vec.size()-1);
	for (int k = 0; k != vec.size(); k++)
	{
		cout << vec[k] << " ";
	}
}
void G_sort(vector<int> &vec,int begin, int end)
{
	if (end-begin <= 0)
		return;
	int mid = begin+ (end-begin) / 2;
	G_sort(vec, begin, mid);
	G_sort(vec, mid+1, end);
	merge(vec,begin,mid,end);
}
void merge(vector<int> &vec,int begin,int mid,int end)
{
	vector<int> m;
	int left = begin;
	int right = mid + 1;
	for (int i = begin; i <= end; i++)
	{
		if (left <= mid && right <= end)
		{
			if (vec[left] <= vec[right])
			{
				m.push_back(vec[left]);
				left++;
			}
			else
			{
				m.push_back(vec[right]);
				right++;
			}
		}
		else
		{
			if (left <= mid)
			{
				m.push_back(vec[left]);
				left++;
			}
			else if (right <= end)
			{
				m.push_back(vec[right]);
				right++;
			}
		}
	}
	for (int j = 0; j != m.size(); j++)
	{
		vec[begin + j] = m[j];
	}

}

//快速排序
int fenjie(vector<int> &vec, int begin, int end);
void q_sort(vector<int> &vec, int begin, int end);
void Quick_sort(vector<int> vec)
{
	int len = vec.size();
	q_sort(vec,0,len-1);
	for (int k = 0; k != len; k++)
	{
		cout << vec[k] << " ";
	}
}
void q_sort(vector<int> &vec, int begin,int end)
{
	if (end - begin <= 0)
		return;
	int index=fenjie(vec,begin,end);
	q_sort(vec,begin,index-1);
	q_sort(vec,index+1,end);
}
int fenjie(vector<int> &vec, int begin, int end)
{
	vector<int> vec1, vec2;
	for (int i = begin + 1; i <= end; i++)
	{
		if (vec[i] < vec[begin])
			vec1.push_back(vec[i]);
		else
			vec2.push_back(vec[i]);
	}
	int value = vec[begin];
	int j = begin + vec1.size();
	for (int k = 0; k != vec1.size(); k++)
		vec[begin + k] = vec1[k];
	vec[j] = value;
	for (int k = 0; k != vec2.size(); k++)
		vec[j + 1 + k] = vec2[k];
	vec1.clear();
	vec2.clear();
	return j;
}

main.cpp:测试

 

// main.cpp

#include "_sort.h"
#include<iostream>

int main()
{
	vector<int> v;
	v.push_back(7);
	v.push_back(12);
	v.push_back(99);
	v.push_back(85);
	v.push_back(42);
	v.push_back(75);
	v.push_back(66);
	v.push_back(44);
	Bubble_sort(v);   //冒泡排序:在函数内部排序成功;由于是局部函数且没有添加&,所以排序后,原容器内数据顺序不变
	cout << endl;
	Selection_sort(v);
	cout << endl;
	Insertion_sort(v);
	cout << endl;
	Guibing_sort(v);
	cout << endl;
	Quick_sort(v);
	system("pause");
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章