以下是我对常见的几种排序算法的总结并给出的代码,基于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很小时快速排序往往比其他简单排序方法还要慢)