标签:
直接上代码:
主程序:
#include <iostream> using namespace std; int main() { int a[6]; cout<<"请输入要排序的六个数字:"; //偷个懒,只输入6个数 for(int k=0;k<6;k++) { cin>>a[k]; } cout<<"排序前:"; for(int m=0;m<6;m++) cout<<a[m]<<‘ ‘; cout<<endl; //此处插入各种排序算法核心代码....... cout<<"排序后:"; for(int m=0;m<6;m++) cout<<a[m]<<‘ ‘;
之后就是各种算法的代码了,在调用相应的算法函数前记得先在main函数中声明哦。
首先冒泡排序,这个比较简单,就像冒泡一样(可以从小到大,也可以从大到小),大的升上去,小的降下来。我这里用的是小的降下来,如下:
void popsort(int a[],int n) { int j=0; for(int i=0;i<n-1;i++) { for(j=n-1;j>i;j--) { if(a[j]<a[j-1]) { int c=a[j]; a[j]=a[j-1]; a[j-1]=c; } } } }
然后是快速排序法,这个比较重要,采用的递归分治的思想,但是写起来稍微有点麻烦,得经常练练。我这里采用了csdn上的MoreWindows的白话经典上的写法,感觉这个比较清晰,理解起来不难。
void quick_sort(int a[],int l,int r) { if(l<r){ int i=l,j=r; int x=a[l]; //初始化三个变量,其中l和r对应数组的两个边界(0和n-1),关键值x所在的位置相当于一个坑,需要别人来补,最初的坑的值已经保存到了x中。 while(i<j) { while(j>i&&a[j]>x)//从右边开始找小于x的值 j--; if(i<j) a[i++]=a[j]; //这里i++主要是因为下一步中a[i]不需要跟x比较,而是从a[i+1]开始比较。 while(i<j&&a[i]<x)//从左边开始找第一个大于x的值 i++; if(i<j) a[j--]=a[i]; } a[i] = x; quick_sort(a, l, i - 1); // 对左边递归调用 quick_sort(a, i + 1, r); //对右边递归调用 }
我自己的思路不太一样,我是这样想的:在满足if条件时,将二者交换,这样的话我觉得更好理解一些,而且最后不用再给a[i]赋值了。代码稍有不同,如下:
void quick_sort(int a[],int l,int r) { if(l<r){ int i=l,j=r; int x=a[l]; while(i<j) { while(j>i&&a[j]>x) j--; if(i<j) swap(a[i++],a[j]); //这里采用的swap函数代替的上面的方法1 while(i<j&&a[i]<x) i++; if(i<j) swap(a[j--],a[i]); } quick_sort(a, l, i - 1); //此处为跟方法一的另一个不一样的地方,这里不需要另a[i]=x;了,因为之前交换以后a[i]已经是x了 quick_sort(a, i + 1, r); } }
之后是来个稍微简单点的插入排序,跟打扑克牌的思路一样:代码如下:
1 void Insert_sort(int a[],int n) 2 { 3 for(int i=1;i<n;i++) 4 { 5 for(int j=i;j>0;j--) 6 { 7 if(a[j]<a[j-1]) 8 swap(a[j],a[j-1]); 9 10 } 11 } 12 13 }
堆排序,希尔排序(建立在插入排序基础上),归并排序以后再说,上面几个感觉比较重要。最后给出各个算法的时间复杂度
平均时间复杂度
插入排序
O(n2)
冒泡排序
O(n2)
选择排序
O(n2)
快速排序
O(n log n)
堆排序
O(n log n)
归并排序
O(n log n)
希尔排序
O(n1.25)
over~
标签:
原文地址:http://www.cnblogs.com/jymblog/p/5408752.html