zoukankan      html  css  js  c++  java
  • 算法复习之排序

    一。STL中的sort  

       传入迭代器类型   可以传入伪函数用于自定义类型比较

    STL中多种排序函数:详细解说STL排序

    二.自己实现排序:

    1.快速排序:

    基本思想:定义i,j类似两个哨兵,确定一个基准数

    分别从要排序数组头尾出发遍历从左到右找大于,从右到左找小于,交换,最后保证大于基准数的在右边,小于基准数的在左边

    之后左右区间重复上面步骤直到各区间只有一个数。

     1 #include<iostream>
     2 using namespace std;
     3 void Quick_Sort(int *a,int left,int right)
     4 {
     5     int i,j;
     6     if(left>right)
     7     return;
     8     int temp;//基准数  快速排序1的优化的一个方面在于基准数的选择,先选最左面为基准数
     9     temp=a[left];
    10     i=left;
    11     j=right;
    12     while(i!=j)    //i,j两个没有相遇
    13     {
    14       while(a[j]>=temp&&i<j)
    15       j--;
    16       while(a[i]<=temp&&i<j)
    17       i++;
    18       if(i<j)
    19       {
    20           int t=a[i];
    21           a[i]=a[j];
    22           a[j]=t;
    23       }
    24     } 
    25     a[left]=a[i];
    26     a[i]=temp;     //基准数归位
    27     Quick_Sort(a,left,i-1);
    28     Quick_Sort(a,i+1,right);
    29     return; 
    30 }
    31 int main()
    32 {
    33     int a[8]={1,8,5,9,3,7,6,5};
    34     Quick_Sort(a,0,7);
    35     for(int i=0;i<8;i++)
    36     cout<<a[i]<<" ";
    37     cout<<endl;
    38     return 0;
    39 }

    针对快排的优化:

    1).选择基准数时。,三数取中:对left,mid,right,三位排序,取中间数

    2).当分治到长度较小时,使用插入排序

    3).在一次分割后,可以把与基准值相同的元素聚在一起,继续下次分割时,不用再对与其相同元素进行分割。

    2.插入排序

    基本思想:就像发牌时抽牌,一部分是已经抽好的放在手上,一部分还在桌上,现在从桌上的牌取一张与手上已经排好序的牌比较,找到位置插入。

     1 #include<iostream>
     2 using namespace std;
     3 void Insert_Sort(int *a,int a_length)
     4 {
     5     int i,j;
     6     for(j=1;j<a_length;j++){
     7         int key=a[j];
     8         i=j-1;
     9         while(i>=0&&a[i]>key)
    10         {
    11             a[i+1]=a[i];
    12             i--;
    13         }
    14         a[i+1]=key;
    15     }
    16 }
    17 int main()
    18 {
    19     int a[10]={1,8,5,6,0,2,3,4,10,6};
    20     Insert_Sort(a,10);
    21     for(int i=0;i<10;i++)
    22     cout<<a[i]<<" ";
    23     cout<<endl;
    24     return 0;
    25 } 

    3.归并排序

    采用分治

    欲使整体序列有序,先使子序列有序,而后归并

    void Merge(int *a,int *temp,int start,int end)
    {
        if(start>=end) return;
        int len=end-start,mid=(len>>1)+start;
        //分成两个子区间,递归下去,直到每个子区间只有一个数 
        int start1=start,end1=mid;
        int start2=mid+1,end2=end;
        Merge(a,temp,start1,end1);
        Merge(a,temp,start2,end2);
        //然后比较,归并,temp用于保存中间结果
        int k=start;
        while(start1<=end1&&start2<=end2)
        temp[k++]=a[start1]<a[start2]?a[start1++]:a[start2++];
        //如果比较后有剩余部分,则全部合并上去
        while(start1<=end1)
        temp[k++]=a[start1++];
        while(start2<=end2)
        temp[k++]=a[start2++];
        //最后再换回去
        for(k=start;k<=end;k++)
        a[k]=temp[k]; 
    }
    
    void Merge_Sort(int a,int len)
    {
        int temp[len]={0};
        Merge(a,temp,0,len-1);
    }

    4.冒泡排序  最熟悉的排序

     1 #include<iostream>
     2 using namespace std;
     3 void Bubble_Sort(int *a,int len)
     4 {
     5     for(int i=0;i<len-1;i++)
     6     for(int j=0;j<len-i-1;j++)
     7     {
     8         if(a[j]>a[j+1])
     9         {
    10             int temp=a[j];
    11             a[j]=a[j+1];
    12             a[j+1]=temp;
    13         }
    14     }
    15 }
    16 
    17 int main()
    18 {
    19     int a[10]={1,0,2,8,5,9,6,7,2,1};
    20     Bubble_Sort(a,10);
    21     for(int i=0;i<10;i++)
    22     cout<<a[i]<<" ";
    23     cout<<endl;
    24     return 0;
    25 }

    5.堆排序

  • 相关阅读:
    怎样通过iPhone Safari 来安装测试版ipa
    UINavigationController检测后退按钮被按下
    Android系统在超级终端下必会的命令大全(adb shell命令大全)
    so 加载符号找不到的问题解决
    Ubuntu Android 开发jdk1.5和1.6之间的切换
    UIView animation
    HTC G11 获取Root权限图文教程
    Android.mk文件语法规范
    Android NDK 下的宽字符编码转换及icu库的使用
    [转载].NET制作安装卸载程序 Virus
  • 原文地址:https://www.cnblogs.com/wtblogwt/p/9709339.html
Copyright © 2011-2022 走看看