各种排序算法汇总(交换排序:冒泡排序、快速排序)
2015-02-09 22:38
441 查看
以下是我对常见的几种排序算法的总结并给出的代码,基于C++语言实现,存储格式是顺序表。本人才疏学浅,如果有错漏还请各位指正。
一、存储格式:顺序表
二、交换排序
1.冒泡排序:
(1)思路:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。

另外附上一个很形象的冒泡排序以及快速排序算法flash演示http://www.tudou.com/v/htKY1-Rj9ZE
(2)空间复杂度:只需要一个记录的附加空间,即data[0](即O(1))
(3)时间复杂度:O(n^2)
(4)稳定性:稳定
(5)源代码:
(6)分析:思路简单,代码容易实现,但是效率低。是经典的排序算法,常用作编程新手入门学习。
2.快速排序:
(1)思路:任取待排序对象序列的某个对象(例如取第一个对象)作为基准按照该对象的排序码大小,将整个对象序列分为左右两个子序列:左侧子序列中的所有对象的排序码都小于等于基准对象的排序码,右侧子序列中的所有对象的排序码都大于等于基准对象的排序码;基准对象则排在这两个子序列的中间(这也是该对象最终安放位置);然后分别对这两个子序列(递归)重复施行上述方法直到所有对象排在相应位置上为止。


(2)空间复杂度:在最坏的情况下,所占用的附加存储(栈)将达到O(n);
(3)时间复杂度:O(n*lnn)。
(4)稳定性:不稳定
(5)源代码:
(6)分析:快速排序效率较高,且利用了分治法的思路,因此在面试、考研中常有涉及。就平均时间而言,快速排序是所有内排序方法中最好的一个(适用于n较大,当n很小时快速排序往往比其他简单排序方法还要慢)
一、存储格式:顺序表
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很小时快速排序往往比其他简单排序方法还要慢)
相关文章推荐
- 排序算法(三)交换类排序:冒泡排序和快速排序
- 算法 排序算法之交换排序--冒泡排序和快速排序
- 排序算法----交换排序(冒泡排序,快速排序)
- java实现各种排序算法(包括冒泡排序,选择排序,插入排序,快速排序(简洁版))及性能测试
- 图解"数据结构--内部排序算法"----交换排序:冒泡排序、快速排序
- 简单的排序算法——插入排序,选择排序,交换排序(冒泡排序,快速排序)
- 各种排序总结(一)之--—冒泡排序、选择排序、快速排序
- 交换排序算法---冒泡排序与快速排序
- 【排序算法】冒泡排序 bubble sort(交换类排序)
- 常见排序算法汇总与分析(上)(交换排序与插入排序)
- 交换排序:冒泡排序与快速排序
- 常见的五类排序算法图解和实现(交换类:冒泡排序,递归的快速排序)
- 经常使用排序算法实现[交换排序之冒泡排序、高速排序]
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 交换排序之冒泡排序和快速排序
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
- 排序算法-->直接排序,冒泡排序,快速排序
- 排序算法汇总(选择排序 ,直接插入排序,冒泡排序,希尔排序,快速排序,堆排序)
- C语言常用的几种排序算法代码(选择排序,冒泡排序,插入排序,快速排序)
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序