您的位置:首页 > 其它

各种排序算法汇总(交换排序:冒泡排序、快速排序)

2015-02-09 22:38 549 查看
以下是我对常见的几种排序算法的总结并给出的代码,基于C++语言实现,存储格式是顺序表。本人才疏学浅,如果有错漏还请各位指正。

一、存储格式:顺序表

int *data;			//存储数据(data[1...size]存储待排序序列,data[0]为临时单元)
int size;			//可存放容量


二、交换排序

1.冒泡排序:

(1)思路:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。



另外附上一个很形象的冒泡排序以及快速排序算法flash演示http://www.tudou.com/v/htKY1-Rj9ZE

(2)空间复杂度:只需要一个记录的附加空间,即data[0](即O(1))

(3)时间复杂度:O(n^2)

(4)稳定性:稳定

(5)源代码:

//冒泡排序(从前往后冒泡)
void SeqList::bubbleSort()
{
bool flag = false;						//设置交换标志(true表明有进行交换,false则没有交换)
for (int i = 1; i <size; i++)				//共做size-1趟冒泡
{
for (int j = 1; j <= size - i; j++)
{
if (data[j]>data[j + 1])			//不符合顺序则交换
{
flag = true;					//有交换
data[0] = data[j];
data[j] = data[j + 1];
data[j + 1] = data[0];
}
}
if (!flag)
break;							//无交换则结束冒泡排序
}
}


(6)分析:思路简单,代码容易实现,但是效率低。是经典的排序算法,常用作编程新手入门学习。

2.快速排序:

(1)思路:任取待排序对象序列的某个对象(例如取第一个对象)作为基准按照该对象的排序码大小,将整个对象序列分为左右两个子序列:左侧子序列中的所有对象的排序码都小于等于基准对象的排序码,右侧子序列中的所有对象的排序码都大于等于基准对象的排序码;基准对象则排在这两个子序列的中间(这也是该对象最终安放位置);然后分别对这两个子序列(递归)重复施行上述方法直到所有对象排在相应位置上为止。





(2)空间复杂度:在最坏的情况下,所占用的附加存储(栈)将达到O(n);

(3)时间复杂度:O(n*lnn)。

(4)稳定性:不稳定

(5)源代码:

//快速排序主过程
void SeqList::quickSort(int low, int high)
{
int mid;
if (low <= high)
{
mid = quickPass(low, high);
quickSort(low, mid - 1);			//递归排序左半部分
quickSort(mid + 1, high);			//递归排序右半部分
}
}

//一趟快速排序
int SeqList::quickPass(int low,int high)
{
data[0] = data[low];					//暂存
while (low < high)
{
while ((low < high) && (data[high] >= data[0]))		//从后往前扫描
--high;
if (low < high)		//在被腾出来的单元(由low指向)填入data[high],并将low向右移动一个单元
data[low++] = data[high];
while ((low < high) && (data[low] <= data[0]))		//从前往后扫描
++low;
if (low < high)		//在被腾出来的单元(由high指向)填入data[low],并将high向左移动一个单元
data[high--] = data[low];
}
data[low] = data[0];			//在正确的位置填入基准记录

return low;
}

(6)分析:快速排序效率较高,且利用了分治法的思路,因此在面试、考研中常有涉及。就平均时间而言,快速排序是所有内排序方法中最好的一个(适用于n较大,当n很小时快速排序往往比其他简单排序方法还要慢)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐