冒泡排序、選擇排序、插入排序、歸併排序、快速排序 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;
}

 

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