第八章 排序—交换排序
数据结构 基础代码(严蔚敏 人邮出版社)
冒泡排序
#include <iostream>
using namespace std;
int bubbleSort (int A[],int N)
{
int sw=0;
bool flag=1;
for(int i=0;flag;i++)//c++中的for循环,for(init;condition;increment)init 会首先被执行,且只会执行一次。
{ //接下来判断condition 若为真,则执行循环主体。反之不执行循环主体。在执行完 for 循环主体后,跳回上面的 increment 语句。
flag=0; //flag为1,执行循环,flag改变。
for(int j=N-1;j>=i+1;j--)//从数组最末尾结点开始起泡,只要j的位置在i位置后面就比较交换。
{
if(A[j]<A[j-1]) //如果比前一个小就换
{
swap(A[j],A[j-1]);
flag=1; //发生交换flag标志发生改变。
sw++; //交换一次SW+1
}
}
}
return sw;
}
int main()
{
int A[100],N,sw; //定义局部变量N,sw,数组A[] 注意:main函数内的变量也是局部变量,只是声明周期和全局变量一样长。
cin >> N;
for(int i=0;i<N;i++)
{
cin >> A[i];
}
sw=bubbleSort(A,N);
for(int i=0;i<N;i++)
{
if(i)
{
cout <<" ";
}
cout <<A[i];
}
cout << endl;
cout << sw << endl;
return 0;
}
输入数组个数为 5
数组A[5]={5 2 4 3 1}
冒泡排序后的结果为 1 2 3 4 5
排序共计进行8次交换。
快速排序
//快速排序
#include <iostream>
using namespace std;
int Partition (int A[],int low,int high)
{
int v=A[low]; //用子表第一个记录来作为枢轴记录
int pivotkey = A[low];//枢轴记录的关键字保存在pivotkey中。
while (low<high) //当low的值大于等于high的时候证明两端交替扫描结束,找到合适位置。
{
while(low<high && A[high]>=pivotkey) //如果右端的值大于等于枢轴的值,继续从右向左扫描。
{
--high;
}
A[low]=A[high]; //否则把右端的值移动到左端。
while(low<high && A[low]<=pivotkey) //如果左端的值小于等于枢轴的值,继续从左向右扫描。
{
++low;
}
A[high]=A[low]; //否则把左端的值移动到右端
}
A[low]=v; //把枢轴的值插入到合适的位置,此时枢轴左端的值均小于等于枢轴的值
return low; //枢轴右端的值均大于等于枢轴的值。
}
void Qsort(int A[],int low,int high)
{
int pivotloc;
if(low<high) //表长大于1,进行排序
{
pivotloc= Partition(A,low,high); //将表一分为2
Qsort(A,low,pivotloc-1); //左子表继续递归排序
Qsort(A,pivotloc+1,high); //右子表继续递归排序
}
}
void QuickSort(int A[],int N)
{
Qsort(A,0,N);
}
int main()
{
int i,N;
int A[100];
cin >> N;
for(i=0;i<N;i++)
{
cin >> A[i];
}
//sw=bubbleSort(A,N);
QuickSort(A,N);
for(i=0;i<N;i++)
{
if(i)
{
cout<<" ";
}
cout << A[i];
}
cout <<endl;
//cout << sw;
}
结果输出如上图,元素个数输入5 表内元素为 5 3 2 4 1.