冒泡、插入、希尔和快速排序算法
2013-10-19 14:50
260 查看
#define MAXN 7 #include<iostream> using namespace std; int a[MAXN] = {4,3,2,1,5,9,6}; //交换 void swap(int &a,int &b) { int tmp; if(a > b) { tmp = a; a = b; b = tmp; } } //输出 void show() { int i; for(i=0; i<MAXN; i++) cout<< a[i] << " "; cout << endl; } /*======================冒泡排序=========================*/ void BubbleSort(int a[],int n) { int i,j; for(i=0; i<n; i++) { for(j=1; j<n-i; j++) { swap(a[j-1],a[j]); } } } //冒泡排序优化 void BubbleSort2(int a[],int n) { int i; int k = n; bool flag = true; //如果有一个内层循环没有发生交换,说明数组已经排序好了 while(flag) { flag = false; for(i=1; i<k; i++) { swap(a[i-1],a[i]); flag = true; } k--; } } //冒泡排序再优化 void BubbleSort3(int a[],int n) { int i,k; int index = n; bool flag = true; while(flag) { flag = false; k = index; for(i=1; i<k; i++) { swap(a[i-1],a[i]); index = i; flag = true; } } } /**快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 步骤为: 1、从数列中挑出一个元素,称为 "基准"(pivot), 2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。 在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。 虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 **/ //快速排序 int Partition(int a[],int low,int high) { int pivot = a[low]; while(low < high) { while(low < high && a[high] > pivot) high--; a[low] = a[high]; while(low < high && a[low] <= pivot) low++; a[high] = a[low]; } a[low] = pivot; return low; } void QuickSort(int a[],int low,int high) { int loc = 0; if(low < high) { loc = Partition(a,low,high); QuickSort(a,low,loc-1); QuickSort(a,loc+1,high); } } /** **插入排序算法描述如下: *1、从第一个元素开始,该元素可以认为已经被排序 *2、取出下一个元素,在已经排序的元素序列中从后向前扫描 *3、如果该元素(已排序)大于新元素,将该元素移到下一位置 *4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 *5、将新元素插入到该位置后 *6、重复步骤2~5 **/ /*======================插入排序=========================*/ void InsertSort(int a[],int n) { int i,j; int tmp;//每次保存较小的数 for(i=1; i<n; i++) { if(a[i-1] > a[i]) { j=i; tmp = a[i]; //插入 while(j > 0 && a[j-1] > tmp) { a[j] = a[j-1]; j--; } a[j] = tmp; } } } /**希尔排序算法思路:分组,然后各组直接插入排序 /*======================希尔排序=========================*/ void ShellSort(int a[],int n) { for(int gap=n/2; gap>0; gap /=2) for(int i=gap; i<n; ++i) { int key = a[i]; int j = 0; for(j=i-gap; j>=0 && a[j]>key; j-=gap) a[j+gap] = a[j]; a[j+gap] = key; } } int main() { cout<< "排序前:"; show(); //BubbleSort(a,MAXN); //cout<<"冒泡排序后:"; //show(); //InsertSort(a,MAXN); //cout<<"插入排序后:"; //show(); //QuickSort(a,0,MAXN-1); //cout<<"快速排序后:"; //show(); ShellSort(a,MAXN); show(); return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构与算法揭秘二
- C#数据结构揭秘一
- 浅析STL中的常用算法
- JavaScript 组件之旅(二)编码实现和算法
- Java数据结构之简单链表的定义与实现方法示例
- qqwry.dat的数据结构图文解释第1/2页
- Java数据结构之双端链表原理与实现方法
- 将15位身份证补全为18位身份证的算法示例详解
- C++算法系列之日历生成的算法代码
- Huffman 编码压缩算法
- C 的反思穷究链表
- 1 2 3 4 5 6 7 8 9 = 110的java实现
- Sedgewick之巨著《算法》,与高德纳TAOCP一脉相承
- 【代码】Pythonの代码片段
- STL中算法
- 数据结构&算法学习
- 算法的时间复杂度