/*
名称:交换排序—冒泡排序和快速排序
说明:
对于冒泡排序来说,其相对来说简单些,每次比较把相邻的元素比较,把较小的移动到前面,总共比较n-1次。最终的时间复杂度为O(N2)。要注意一点的是,在编程实现冒泡排序的时候,如果某一趟排序时,元素之间并没有进行交换,则说明已经有序,则不用在进行接下来的排序。具体的做法是保存一个flag变量。冒泡排序是一个稳定的排序算法。
对于快速排序来说,它是交换排序的一个改进。是基于分治算法的。在冒泡排序中每趟排序已经产生了一些有序的短的自序列,而下一次排序时还要接着进行比较,从某种程度上说,这其实是一种浪费,应该可以用某种方式进行改进。快速排序就是一种改进的方法,它把每次划分,把比较的区间分为两部分,这样排序过程产生的短的有序序列在比较时就会减少很多。从而达到降低时间复杂度的效果。其最坏的时间复杂度是O(N2),最好的情况下是O(Nlog2N),平均情况接近与最好的情况。
还有,由于其是递归调用,所以需要占用一个递归工作栈。空间复杂度最高时O(N),初始序列已经是有序的情况,最低是O(log2(n)),平均是O(log2(n))。它是一个不稳定的排序算法。
*/
#include<iostream>
using namespace std;
//冒泡排序
void BubbleSort(int elem[],int n)
{
bool flag = false; //用来当作是否此躺是否有交换的标志
int temp = 0;
for(int i = 0;i < n-1;++i) //总共循环n-1躺,每次都把一个元素放到最终的位置上
{
flag = false;
for(int j = n-1; j > i; --j) //每趟循环j-i次
{
if(elem[j] < elem[j-1]) //如果比前面的小,就进行交换
{
temp = elem[j];
elem[j] = elem[j-1];
elem[j-1] = temp;
flag = true;
}
}
if( flag == false) //如果此躺没有进行交换,则说明已经有序
return ;
}
}
//划分函数
int Partition(int elem[],int low,int high)
{
int pivot = elem[low]; //子序列的第一个元素作为基准值
while(low < high)
{
while(low < high && elem[high] > pivot) //将比基准值小的元素移动到左端
--high;
elem[low] = elem[high];
while(low < high && elem[low] < pivot) //将比基准值大的元素移动到右端
++low;
elem[high] = elem[low];
}
elem[low] = pivot; //基准值最后的位置
return low; //返回最终基准的位置
}
//快速排序
void QuickSort(int elem[],int low,int high)
{
if(low < high)
{
int pivort = Partition(elem,low,high); //划分子区间
QuickSort(elem,low,pivort-1); //递归调用左半边的区间
QuickSort(elem,pivort+1,high); //递归调用右半边的区间
}
}