需要注意的问题:
在QuickSort中,两个while的顺序不能放反了;
#include <iostream>
using namespace std;
void swap(int &a,int &b )
{
int t=a; a=b; b=t;
}
void BubbleSort(int A[], int n); //冒泡排序
void SelectSort(int A[], int n); //选择排序
void InsertSort(int A[], int n); //插入排序
void QuickSort(int A[],int low,int high); //快速排序
int main()
{
int a[10]={12,43,2,3,56,76,2,23,9,31};
// BubbleSort(a, 10);
// SelectSort(a, 10);
// InsertSort(a, 10);
QuickSort(a,0,9 );
for (int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
system("pause");
return 0;
}
void BubbleSort(int A[], int n) //冒泡排序
{
int flag=1; //标志位,如果数组已经为有序,则提前停止循环
for (int i=0;i<n-1&&flag;i++)
{
flag=0;
for (int j=0;j<n-1-i;j++)
{
if(A[j]>A[j+1])
{
swap(A[j],A[j+1]);
flag=1;
}
}
}
}
void SelectSort(int A[], int n) //选择排序
{
for (int i=0;i<n-1;i++)
{
int k=i; //用来记录当前最小值的下标
for (int j=i+1;j<n;j++)
if(A[j]<A[k]) k=j;
swap(A[k],A[i]);
}
}
void InsertSort(int A[], int n) //插入排序
{
int i,j;
for (i=1;i<n;i++) //假设第一个是已经排好的
{
int x=A[i];
for (j=i-1;(j>=0)&&(A[j]>x);)//j从排好序列的最后一个开始
{
A[j+1]=A[j]; //找到插入的位置j;
j--; //放在这里便于理解
}
A[j+1]=x;
}
}
void QuickSort(int A[],int low,int high) //快速排序
{
if (low>=high) return; //递归调用的结束条件
int i=low;
int j=high;
int x=A[low]; //将low位置的值作为标准,并且腾空
while (i<j) //注意比较的次序,从high端开始。
{
while(A[j]>x && j>i) j--; if (i<j) {A[i] = A[j]; i++; } //把大的放在一端,小的放在一端
while(A[i]<x && i<j) i++; if (i<j) {A[j] = A[i]; j--; }
}
A[i] = x;
QuickSort(A,low,i-1); //递归调用
QuickSort(A,i+1,high);
}