冒泡排序:对一个一维数组进行两重循环,依次比较两个相邻的元素,如果顺序(如从大到小)错误就把他们交换过来,重复地进行直到没有相邻元素需要交换,则,该元素序列完成排序。
快速排序:首先对这个乱序的元素序列设定一个分界值(我设置的是该元素序列的第一位),将该数组分为左右两部分,然后将大于或等于分界值的元素集中到右边,将各元素小于或等于分界值的元素集中到左边,再递归对分界值两边的元素进行排序。
堆排序:升序排序时,先将待排序的序列调整为一个大顶堆,这个时侯,整个序列的最大值就是堆顶的根节点,之后将其与末尾元素交换,重新调整该堆,使其余元素重新构成一个大顶堆,反复执行后,即可得到有序序列。
—main.cpp(测试文件)
#include
#include"mysort.h"
using namespace std;
int main()
{
cout<<"采用冒泡排序:"<<endl;
cout<<"原始数组为整形数组a"<<endl;
cout<<"其元素分别为:{1,5,3,4}"<<endl;
int a[4] = {1,5,3,4};
cout<<"对该数组的 1-3 位排序"<<endl;
maopao(a,1,4);
cout<<"输出排序后的数组:"<<endl;;
for(int i=0;i<getsize(a);i++)
cout<<a[i]<<" ";
cout <<endl;
cout<<"对该数组排序"<<endl;
cout<<"输出排序后的数组:"<<endl;;
maopao(a);
for(int i=0;i<getsize(a);i++)
cout<<a[i]<<" ";
cout <<endl<<endl;
cout<<"采用快速排序"<<endl;
cout<<"原始数组为字符型数组b(按ASCII码)"<<endl;
cout<<"其元素分别为:{'g','s','d','a'} "<<endl;
char b[] = {'g','s','d','a'};
cout<<"对该数组的1-3位排序"<<endl;
qsort(b,0,2);
cout<<"输出排序后的结果"<<endl;
for(int i=0;i<4;i++)
cout<<b[i]<<" ";
cout<<endl;
cout<<"对该数组的排序"<<endl;
qsort(b,0,getsize(b)-1);
cout<<"输出排序后的结果"<<endl;
for(int i=0;i<4;i++)
cout<<b[i]<<" ";
cout<<endl<<endl;
cout<<"采用堆排序"<<endl;
cout<<"原始浮点数组为:{1.2,5.3,2.7,6.5,9.1}"<<endl;
double d[]={1.2,5.3,2.7,6.5,9.1};
cout<<"对该数组排序"<<endl ;
HeapSort(d );
cout<<"输出排序后结果:"<<endl;
for(int i=0;i<5;i++)
cout<<d[i]<<" ";
cout<<endl;
return 0;
}
/*
maopao( a )
maopao( a ,int start,int end)
qsort( a )
qsort( a,int low,int high)
HeapSort(a )
*/
mysort.h(函数文件)
#include
#include
using namespace std;
template <typename T> int getsize(T &array)
{
return sizeof(array)/sizeof(array[0]);
}
template <typename T> void maopao(T &a)
{
int len = getsize(a);
for(int i=0;i<len;i++)
for(int j=0;j<i;j++)
{
if(a[i]<a[j]) swap(a[i],a[j]);
}
}
template <typename T> void maopao(T &a,int start,int end)
{
int len = end-start;
for(int i=0;i<len;i++)
for(int j=0;j<i;j++)
{
if(a[i]<a[j]) swap(a[i],a[j]);
}
}
template <typename T> void qsort(T &a,int low,int high)
{
if(low>=high) return ;
int i=low+1, j = high;
int key = a[low];
while(1)
{
while(1){
if(key < a[j]&&j>low)
j--;
else break;
}
while(1){
if(a[i]< key&&i<high)
i++;
else break;
}
if(i>=j) break;
else swap(a[i],a[j]);
}
swap(a[low],a[j ]);
qsort(a,low,j -1);
qsort(a,j +1,high);
}
template <typename T> int HeapAdjust(T &L , int n, int s)
{
int i = s;
while (i + i + 1 < n)
{
int j = i + i + 1;
if (j + 1 < n && L[j] < L[j + 1])
j++;
if (L[j] <= L[i])
break;
swap(L[j], L[i]);
i = j;
}
return 0;
}
template <typename T> int CreateHeap( T &L , int n)
{
for (int i = n / 2 - 1; i >= 0; i--)
{
HeapAdjust(L, n, i);
}
return 0;
}
template <typename T> int HeapSort(T &L )
{
int n = getsize(L);
CreateHeap(L, n);
for (int i = n; i > 1; i--)
{
swap(L[0], L[i - 1]);
HeapAdjust(L, i - 1, 0);
}
return 0;
}
template <typename T> int HeapSort(T &L,int n )
{
CreateHeap(L, n);
for (int i = n; i > 1; i--)
{
swap(L[0], L[i - 1]);
HeapAdjust(L, i - 1, 0);
}
return 0;
}