排序算法总结(二)

归并排序:

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。我们一般取中位数,将前后两部分排序在归并为一个序列,递归完成。

#include <iostream>

using namespace std;
void merge(int a[],int low,int mid, int high)
{
    int b[6];
    int start = 0;
    int i=low,j=mid+1;
    while(i <= mid && j <= high)
    {
        if(a[i] <= a[j])
        {
            b[start] = a[i];
            start++;
            i++;
        }
        if(a[i] > a[j])
        {
            b[start] = a[j];
            start++;
            j++;
        }
    }
    if(i <= mid)
    {
        for(int k = i;k<=mid;k++)
        {
            start++;
            b[start] = a[k];
        }
    }
    if(j <= high)
    {
        for(int m = j;m<=high;m++)
        {
            start++;
            b[start] = a[m];
        }
    }
    for(int n = 0;n<6;n++)
		a[n] = b[n];
    return;
}
void mergeSort(int a[],int low,int high)
{
    int mid = 0;
    if(low < high)
    {
        mid = (low + high)/2;
        mergeSort(a,low,mid);
        mergeSort(a,mid+1,high);
        merge(a,low,mid,high);
    }
    return;
}
int main()
{
    int a[] = {2,5,9,3,4,7};
    mergeSort(a,0,5);
    for(int i = 0;i<6;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}
冒泡排序:

依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

#include <iostream>

using namespace std;
void BubbleSort(int a[],int n)
{
    int i=0,temp=0,j=0;
    for(i=0;i<n;i++)
    {
        for(j=i;j<n;j++)
        {
            if(a[j] > a[i])
            {
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
    }
    return;
}
int main()
{
    int a[]={2,5,4,3,6,7,1};
    BubbleSort(a,7);
    for(int i=0;i<7;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

选择排序:

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

#include <iostream>

using namespace std;
void selectSort(int a[],int n)
{
    int min=0,temp=0,j;
    for(int i = 0; i < n;i++)
    {
        min = i;
        for(j= i+1;j<n;j++)
        {
            if(a[j]>a[min])
                min = j;
        }
        if(min != i)
        {
            temp = a[min];
            a[min] = a[i];
            a[i] = temp;
        }

    }
    return;
}
int main()
{
    int a[]={2,5,4,3,6};
    selectSort(a,5);
    for(int i= 0;i<5;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

希尔排序:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

#include <iostream>

using namespace std;

void shellSort(int a[],int n,int x)//一趟增量为x
{
    int i,j;
    for(i = x;i<n;i++)
    {
        if(a[i] < a[i-x])
        {
            int temp = a[i];
            for(j= i-x;j>0 && temp<a[j];j-=x)
            {
                a[j+x] = a[j];
            }
            a[j+x]=temp;
        }
    }
}

void shell(int a[],int n,int b[],int x)
{
    for(int k=0;k<x;k++)
        shellSort(a,n,b[k]);
    return;
}
int main()
{
    int a[]={109,38,65,97,76,13,27,49,55,4};
    int b[]={5,3,1};
    shell(a,10,b,3);
    for(int i = 0;i<10;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值