第1个回答 2011-07-06
//常见的排序算法
//创建日期:2011年4月22
#include <iostream>
using namespace std;
#define MAX_OF_ARRAY 10 //待排序的数组最大数值
int iTemp = 0;
int iTimes = 0;
//交换数据
void Change(int *a, int *b)
{
iTemp = *a;
*a = *b;
*b = iTemp;
iTimes++;
}
//打印数据
void Print(int *arrays)
{
for(int i = 0; i < MAX_OF_ARRAY; i++)
{
cout << *arrays << " ";
arrays++;
}
cout << endl;
cout << "总共交换次数:" << iTimes << endl;
}
/******************************************/
//插入法排序InsertSort(int *arrays)
/******************************************/
void InsertSort(int *arrays)
{
int itemp;
for(int i = 0; i < MAX_OF_ARRAY; i++)
{
itemp = i;
for(int j = i - 1; arrays[itemp] > arrays[j] && j >= 0; itemp-- && j--)
Change(&arrays[itemp], &arrays[j]);
}
}
/******************************************/
//选择排序SelectSort(int *arrays)
/******************************************/
void SelectSort(int *arrays)
{
for(int i = 0; i < MAX_OF_ARRAY; i++)
{
int IMAX = i;
for(int j = i + 1; j < MAX_OF_ARRAY; j++)
{
if(arrays[j] > arrays[IMAX])
IMAX = j;
}
if(IMAX != i)
{
Change(&arrays[IMAX], &arrays[i]);
}
}
}
/******************************************/
//冒泡排序法BubbleSort(int *arrays)
/******************************************/
void BubbleSort(int *arrays)
{
int BUBBLE = 0;
while(BUBBLE == 0)
{
BUBBLE = 1;
for(int i = 0; i < MAX_OF_ARRAY - 1; i++)
{
if(arrays[i] < arrays[i + 1])
{
Change(&arrays[i], &arrays[i + 1]);
BUBBLE = 0;
}
}
}
}
/******************************************/
//快速排序法QuickSort(int *arrays)
/******************************************/
void QuickSort(int *arrays, int arraylen)
{
if(arraylen > 1)
{
int num = 0, i = 0, j = arraylen - 1, itemp = 0;
while(i != j)
{
i = 0, j = arraylen - 1, itemp = 0;
//from back to front to search the number which is greater than the key number,then change;
for(j; j > num; j--)
{
if(arrays[num] < arrays[j])
{
Change(&arrays[num], &arrays[j]);
num = j;
break;
}
}
//from back to front to search the number which is less than the key number, then change;
for(i; i < num; i++)
{
if(arrays[num] > arrays[i])
{
Change(&arrays[num], &arrays[i]);
num = i;
break;
}
}
}
QuickSort(arrays, num);
QuickSort(arrays + num + 1, arraylen - num - 1);
}
}
/******************************************/
//堆排序法HeapSort(int *arrays)
/******************************************/
void HeapKeepMax(int *arrays, int iNode, int Length)
{
int ChildNode = 0;
//结点下移,直至大于总长度
for(int i = iNode; 2 * iNode + 2 <= Length; iNode = ChildNode)
{
ChildNode = iNode * 2 + 1;
//保持ChildNode指向子结点中的较大者
if((ChildNode + 1 < Length) && arrays[ChildNode] < arrays[ChildNode + 1])
ChildNode++;
//如果结点比子结点小,交换
if(arrays[iNode] < arrays[ChildNode])
Change(&arrays[iNode], &arrays[ChildNode]);
else
break;
}
}
void HeapAdjust(int *arrays, int Length)
{
for(int i = (Length - 2) / 2; i >= 0; i--)
HeapKeepMax(arrays, i, Length);
Change(&arrays[0], &arrays[Length - 1]);
}
void HeapSort(int *arrays, int Length)
{
for(int i = Length; i > 1; i--)
HeapAdjust(arrays, i);
}
/******************************************/
//归并排序法MergeSort(int *arrays)
/******************************************/
void main()
{
int arrays[MAX_OF_ARRAY] = {3, 25, 35, 1, 2, 64, 33, 9, 23, 7};
// InsertSort(arrays);
// SelectSort(arrays);
// BubbleSort(arrays);
// QuickSort(arrays, MAX_OF_ARRAY);
HeapSort(arrays, MAX_OF_ARRAY);
Print(arrays);
}
第2个回答 2011-07-05
void sort(int *a,int x,int y)
{
int xx=x,yy=y;
int k=a[x];;//以第一个数为参照做比较
if(x>=y) return ;
while(xx!=yy)
{
while(xx<yy&& a[yy]>=k)
yy--;//不小于分界值的留在右边,遇到小于的停止
a[xx]=a[yy];
while(xx<yy&& a[xx]<=k)
xx++;//小于分界值的留在左边,遇到不小于的停止
a[yy]=a[xx];
}
a[xx]=k;
sort(a,x,xx-1);//递归
sort(a,xx+1,y);
}
第3个回答 2011-07-12
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
int n,a[100000];
void Init()
{
scanf("%d",&n);
for(int i=0;i!=n;++i) scanf("%d",&a[i]);
}
void Qsort(int l,int r)
{
int i,j,mid,t;
i=l;
j=r;
mid=a[(i+j)>>1];//选择中间元素作为基准
while(i<=j)
{
while(a[i]<mid) ++i;//找到一个在mid左边且不小于mid的元素
while(a[j]>mid) --j;//找到一个在mid右边且不大于mid的元素
if(i<=j)
{
swap(a[i],a[j]);//交换
++i;
--j;
}
}
if(i<r) Qsort(i,r);//递归
if(l<j) Qsort(l,j);//递归
}
void Print()
{
for(int i=0;i!=n;++i) printf("%d ",a[i]);
}
int main()
{
Init();//读入
Qsort(0,n-1);//快速排序
Print();//输出
return 0;
}
第4个回答 2011-07-06
void QuickSort(int *a,int left,int right)
{
if ( left < right )
{
int i = left,t;
int j = right + 1;
int pivot = a[left];
do
{
do
{
i++;
} while ( a[i] < pivot );
do
{
j--;
} while ( a[j] > pivot );
if ( i < j )
{
t=a[i];a[i]=a[j];a[j]=t;
}
} while ( i < j );
if (left != j)
{
t=a[left];a[left]=a[j];a[j]=t;
}
QuickSort(a,left,j-1);
QuickSort(a,j+1,right);
}
}