C++ 冒泡、堆排序、插入排序算法
来源:互联网 发布:淘宝产品摄影 编辑:程序博客网 时间:2024/06/03 11:26
#include <iostream>
#include <vector>
using namespace std ;
#define INFINITE 1000
template<typename T>
class Sort
{
public:
void input(int n);
void print() const;
void BubbleSort();
void InsertSort();
void mergeSort(vector<T> v,int start,int end);
void HeapSort(vector<T>& A, int heap_size);
vector<T> v;
private:
void merge(vector<T> value,int start,int mid,int end);
int parent(int i);
int left(int i);
int right(int i);
void Build_Max_Heap(vector<T>& A,int size);
void Max_Heapify(vector<T>& A, int i, int heap_size);
};
//主菜单
void MainMenu()
{
cout << "****************************************" << endl ;
cout << "* 1.InsertSort *" << endl ;
cout << "* *" << endl ;
cout << "* 2.BubbleSort *" << endl ;
cout << "* *" << endl ;
cout << "* 3.MergeSort *" << endl ;
cout << "* *" << endl ;
cout << "* 4.HeapSort *" << endl ;
cout << "* *" << endl ;
cout << "* 0.Exit *" << endl ;
cout << "****************************************" << endl ;
}
template<typename T>
void Sort<T>::input(int n)
{
cout << "请输入要排列元素的个数:" ;
cin >> n;
cout << "请输入元素:";
for (int i = 0;i < n;++ i)
{
T temp = 0;
cin >> temp;
v.push_back(temp);
}
cout << "输入完毕,请进行后续操作:" << endl;
}
template<typename T>
void Sort<T>::print() const
{
if (!v.empty())
{
for (int i = 0;i < v.size();++ i)
{
cout << v[i] << " ";
}
cout << "\n";
}
else
{
cout << "please make sure the vector is not empty" << endl;
}
}
/***************************以下代码实现冒泡排序*****************************/
template<class T>
void Sort<T>::BubbleSort()
{
//v.resize(n);
for (int i = v.size()-2;i>=0;-- i)
{
for (int j = 0;j<=i;++j)
{
if(v[j+1]<v[j])
{
int t = v[j+1];
v[j+1]=v[j];
v[j]=t;
}//end if
}//end for
}//end for
}
/***************************以下代码实现插入排序*****************************/
template<class T>
void Sort<T>::InsertSort()
{
for (int i = 1;i<v.size();++i)
{
T t = v[i];
T j = i;
while (j>0 && v[j-1]>t)
{
v[j]=v[j-1];
--j;
}
v[j] = t;
}
}
int main()
{
MainMenu();
Sort<float> s;
while (true)
{
int nType = 0;
cout << "请选择要排序的种类:" ;
cin >> nType;
if (0 == nType)
{
break;
}
int n = 0;
s.input(n);
switch(nType)
{
case 1:s.InsertSort();break; //插入排序
case 2:s.BubbleSort();break; //冒泡排序
case 3:s.mergeSort(s.v,0,s.v.size() - 1);break; //归并排序
case 4:s.HeapSort(s.v,s.v.size());break;
}
s.print();
}
system("pause");
return 0;
}
/***************************以下代码实现归并排序*****************************/
template<class T>
void Sort<T>::merge(vector<T> value,int start,int mid,int end)
{
int i ,j,k;
//申请辅助数组
int *array1 = new int[mid-start+2];
int *array2 = new int[end-mid+1];
//把a从mid分开分别赋值给数组
for(i=0;i<mid-start+1;i++)
*(array1+i)=v[start+i];
*(array1+i)=INFINITE;//作为哨兵
for(i=0;i<end-mid;i++)
*(array2+i)=v[i+mid+1];
*(array2+i)=INFINITE;
//有序的归并到数组a中
i=j=0;
for(k=start;k<=end;k++){
if(*(array1+i) > *(array2+j)){
v[k]=*(array2+j);
j++;
}
else{
v[k]=*(array1+i);
i++;
}
}
delete []array1;
delete []array2;
}
//归并排序
template<class T>
void Sort<T>::mergeSort(vector<T> v,int start,int end)
{
//int start = 0;
int mid=(start+end)/2;
if(start<end){
//分解
mergeSort(v,start,mid);
mergeSort(v,mid+1,end);
//合并
merge(v,start,mid,end);
}
}
/***************************以下代码实现堆排序*****************************/
/*求父亲*/
template<typename T>
int Sort<T>::parent(int i)
{
return (int)floor((i) / 2); //floor函数为向下取整
}
/*求左孩子*/
template<typename T>
int Sort<T>::left(int i)
{
return (2 * i);
}
/*求右孩子*/
template<typename T>
int Sort<T>::right(int i)
{
return (2 * i + 1);
}
template<typename T>
void Sort<T>::Max_Heapify(vector<T>& A, int i, int heap_size)
{
int l = left(i);
int r = right(i);
int largest;
/*找到父亲 左孩子 右孩子 之间的最大值*/
if(l <heap_size && A[l] > A[i])
{
largest = l;
}
else
{
largest = i;
}
if(r <heap_size && A[r] > A[largest])
{
largest = r;
}
/*如果父亲不是最大的,则把父亲和两个孩子的较大值交换 */
if(largest != i)
{
swap(A[largest],A[i]);
/*交换之后破坏了较大孩子的堆得性质,对其进行调整*/
Max_Heapify(A, largest, heap_size);
}
}
template<typename T>
void Sort<T>::Build_Max_Heap(vector<T>& A,int size)
{
int begin = size/2 ; // 堆顶元素
for(int i = begin; i >= 0; i--)
{
Max_Heapify(A, i, size);
}
}
template <typename T>
void Sort<T>::HeapSort(vector<T>& A, int heap_size)
{
Build_Max_Heap(A,heap_size);
//建立大顶堆之后 堆顶已经是所有元素中最大的了
//a[0]是数组的第一个元素 a[heap_size - 1]是数组的最后一个元素
/*将堆顶依次和最后一个叶子节点交换 */
for(int i = heap_size - 1; i >= 0; i--)
{
swap(A[i],A[0]);
//交换之后破坏了堆得性质 重新调整 */
Max_Heapify(A, 0, i); //i 是元素个数 每交换依次元素就少一个
}
}
#include <vector>
using namespace std ;
#define INFINITE 1000
template<typename T>
class Sort
{
public:
void input(int n);
void print() const;
void BubbleSort();
void InsertSort();
void mergeSort(vector<T> v,int start,int end);
void HeapSort(vector<T>& A, int heap_size);
vector<T> v;
private:
void merge(vector<T> value,int start,int mid,int end);
int parent(int i);
int left(int i);
int right(int i);
void Build_Max_Heap(vector<T>& A,int size);
void Max_Heapify(vector<T>& A, int i, int heap_size);
};
//主菜单
void MainMenu()
{
cout << "****************************************" << endl ;
cout << "* 1.InsertSort *" << endl ;
cout << "* *" << endl ;
cout << "* 2.BubbleSort *" << endl ;
cout << "* *" << endl ;
cout << "* 3.MergeSort *" << endl ;
cout << "* *" << endl ;
cout << "* 4.HeapSort *" << endl ;
cout << "* *" << endl ;
cout << "* 0.Exit *" << endl ;
cout << "****************************************" << endl ;
}
template<typename T>
void Sort<T>::input(int n)
{
cout << "请输入要排列元素的个数:" ;
cin >> n;
cout << "请输入元素:";
for (int i = 0;i < n;++ i)
{
T temp = 0;
cin >> temp;
v.push_back(temp);
}
cout << "输入完毕,请进行后续操作:" << endl;
}
template<typename T>
void Sort<T>::print() const
{
if (!v.empty())
{
for (int i = 0;i < v.size();++ i)
{
cout << v[i] << " ";
}
cout << "\n";
}
else
{
cout << "please make sure the vector is not empty" << endl;
}
}
/***************************以下代码实现冒泡排序*****************************/
template<class T>
void Sort<T>::BubbleSort()
{
//v.resize(n);
for (int i = v.size()-2;i>=0;-- i)
{
for (int j = 0;j<=i;++j)
{
if(v[j+1]<v[j])
{
int t = v[j+1];
v[j+1]=v[j];
v[j]=t;
}//end if
}//end for
}//end for
}
/***************************以下代码实现插入排序*****************************/
template<class T>
void Sort<T>::InsertSort()
{
for (int i = 1;i<v.size();++i)
{
T t = v[i];
T j = i;
while (j>0 && v[j-1]>t)
{
v[j]=v[j-1];
--j;
}
v[j] = t;
}
}
int main()
{
MainMenu();
Sort<float> s;
while (true)
{
int nType = 0;
cout << "请选择要排序的种类:" ;
cin >> nType;
if (0 == nType)
{
break;
}
int n = 0;
s.input(n);
switch(nType)
{
case 1:s.InsertSort();break; //插入排序
case 2:s.BubbleSort();break; //冒泡排序
case 3:s.mergeSort(s.v,0,s.v.size() - 1);break; //归并排序
case 4:s.HeapSort(s.v,s.v.size());break;
}
s.print();
}
system("pause");
return 0;
}
/***************************以下代码实现归并排序*****************************/
template<class T>
void Sort<T>::merge(vector<T> value,int start,int mid,int end)
{
int i ,j,k;
//申请辅助数组
int *array1 = new int[mid-start+2];
int *array2 = new int[end-mid+1];
//把a从mid分开分别赋值给数组
for(i=0;i<mid-start+1;i++)
*(array1+i)=v[start+i];
*(array1+i)=INFINITE;//作为哨兵
for(i=0;i<end-mid;i++)
*(array2+i)=v[i+mid+1];
*(array2+i)=INFINITE;
//有序的归并到数组a中
i=j=0;
for(k=start;k<=end;k++){
if(*(array1+i) > *(array2+j)){
v[k]=*(array2+j);
j++;
}
else{
v[k]=*(array1+i);
i++;
}
}
delete []array1;
delete []array2;
}
//归并排序
template<class T>
void Sort<T>::mergeSort(vector<T> v,int start,int end)
{
//int start = 0;
int mid=(start+end)/2;
if(start<end){
//分解
mergeSort(v,start,mid);
mergeSort(v,mid+1,end);
//合并
merge(v,start,mid,end);
}
}
/***************************以下代码实现堆排序*****************************/
/*求父亲*/
template<typename T>
int Sort<T>::parent(int i)
{
return (int)floor((i) / 2); //floor函数为向下取整
}
/*求左孩子*/
template<typename T>
int Sort<T>::left(int i)
{
return (2 * i);
}
/*求右孩子*/
template<typename T>
int Sort<T>::right(int i)
{
return (2 * i + 1);
}
template<typename T>
void Sort<T>::Max_Heapify(vector<T>& A, int i, int heap_size)
{
int l = left(i);
int r = right(i);
int largest;
/*找到父亲 左孩子 右孩子 之间的最大值*/
if(l <heap_size && A[l] > A[i])
{
largest = l;
}
else
{
largest = i;
}
if(r <heap_size && A[r] > A[largest])
{
largest = r;
}
/*如果父亲不是最大的,则把父亲和两个孩子的较大值交换 */
if(largest != i)
{
swap(A[largest],A[i]);
/*交换之后破坏了较大孩子的堆得性质,对其进行调整*/
Max_Heapify(A, largest, heap_size);
}
}
template<typename T>
void Sort<T>::Build_Max_Heap(vector<T>& A,int size)
{
int begin = size/2 ; // 堆顶元素
for(int i = begin; i >= 0; i--)
{
Max_Heapify(A, i, size);
}
}
template <typename T>
void Sort<T>::HeapSort(vector<T>& A, int heap_size)
{
Build_Max_Heap(A,heap_size);
//建立大顶堆之后 堆顶已经是所有元素中最大的了
//a[0]是数组的第一个元素 a[heap_size - 1]是数组的最后一个元素
/*将堆顶依次和最后一个叶子节点交换 */
for(int i = heap_size - 1; i >= 0; i--)
{
swap(A[i],A[0]);
//交换之后破坏了堆得性质 重新调整 */
Max_Heapify(A, 0, i); //i 是元素个数 每交换依次元素就少一个
}
}
0 0
- c排序算法:选择、冒泡、插入、快速、归并、堆排序
- C++ 冒泡、堆排序、插入排序算法
- [C++]数据结构:排序算法Part1----冒泡排序、选择排序、插入排序、堆排序
- [C++]数据结构:排序算法Part1----冒泡排序、选择排序、插入排序、堆排序
- C语言排序算法集锦:选择排序,冒泡排序,插入排序,希尔排序,归并排序,堆排序,快排序
- 排序算法----冒泡排序+插入排序+选择排序+快速排序+希尔排序+堆排序+归并排序+计数排序+基数排序+桶排序(c语言)
- 插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序算法比较
- C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- C语言常用的排序方法:冒泡排序,插入排序,快速排序,堆排序,希尔排序
- 冒泡排序、选择排序、插入排序 算法实现(C++)
- 冒泡排序、选择排序、插入排序 算法实现(C++)
- 冒泡排序、选择排序、插入排序 算法实现(C++)
- 冒泡排序、选择排序、插入排序 算法实现(C++)
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- c语言排序算法(所有的都是升序,冒泡排序、插入排序、快速排序、选择排序、希尔排序、堆排序 )
- C 排序算法 (冒泡)(选择)|(插入)|(快速)
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- 排序算法(快速排序,冒泡排序,插入排序,堆排序)
- android解析xml文件的方式(其二)
- Android异步下载网络图片(其三)
- CF 377C Captains Mode(状压dp+博弈)
- memcached 按键查找和批量查找
- pat1008段错误
- C++ 冒泡、堆排序、插入排序算法
- try-catch语句
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 2014/2/24
- SAP alv(lvc)的抬头标题设定(html_top_of_page)
- 低功耗的设置
- 当你真正喜欢一样东西
- libmxml (Mini-XML) arm-linux 移植笔记
- HDU 1244 Max Sum Plus Plus Plus(二维dp)