算法补习-第一天-排序(上)

来源:互联网 发布:a股云计算的上市公司 编辑:程序博客网 时间:2024/04/26 11:20

       交换排序举例:冒泡排序与快排

冒泡排序:

模型:将被排序的记录数组R[1..n]垂直排列,每个记录R看作是重量为R.key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则(降序)的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

算法:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

解释:若升序排,第一次排完,最大的数到数组末尾;若降序排,第一次排完,最小的数到数组末尾,即最轻气泡上浮。即通过对前n项(进行n-1次比较),两两比较得到最大(小)值,放到数组末尾,对剩下的n-1项进行比较。

代码:

#include<iostream>using namespace std; void sort(int *a,int length){int i,j,temp;for(i=0;i<length-1;i++){for(j=0;j<length-1-i;j++){if(a[j]>a[j+1]){temp = a[j+1];a[j+1] = a[j];a[j] = temp;}}}}void show_a(int *m,int length){for(int i=0;i<length;i++) cout<<m[i]<<" ";cout<<endl;}int main(){int a[100],i,n=0;for(i=0;;i++){cin>>a[i];n++;if(getchar()=='\n')break;}sort(a,n);show_a(a,n);return 0;}


补充:

得到列举式数组长度的办法:length=sizeof(data)/sizeof(data[0]);  //数组占内存总空间,除以单个元素占内存空间大小
快速排序:
快速排序是对冒泡排序的一种改进。
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:
代码:
#include<iostream>using namespace std;int Division(int a[],int left,int right){int base = a[left];
        //首先挑选一个基准元素while(left < right){while(left < right && a[right] > base)
<span style="white-space:pre"></span>//从数组的右端开始向前找,一直找到比base小的数字为止(包括base同等数){--right;}
//最终找到了比base小的元素,要做的事情就是此元素放到base的位置a[left] = a[right];while(left < right && a[left] < base){++left;}
//最终找到了比base大的元素,要做的事情就是将此元素放到最后的位置a[right] = a[left];}
//最后就是把base放到该left的位置a[left] = base;
//最终,我们发现left位置的左侧数值部分比left小,left位置右侧数值比left大
//至此,我们完成了第一篇排序
return left;}void QuickSort(int a[],int left,int right){//左下标一定小于右下标,否则就超越了
<span style="white-space:pre"></span>if(left < right){
//对数组进行分割,取出下次分割的基准标号,基准标号即为已经固定的位置int i = Division(a,left,right);
//对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序QuickSort(a,left,i-1);
//对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
QuickSort(a,i+1,right);}}int main(){int i,a[] = {4,5,8,7,2,3,1};int length = sizeof(a)/sizeof(a[0]);QuickSort(a,0,6);for(i=0;i<7;i++){cout<<a[i]<<" ";}cout<<endl;}

0 0
原创粉丝点击