排序算法整理2

希尔排序(缩小增量排序) 时间复杂度:O(nlogn)~O(n^2)

#include "iostream"
using namespace std;
void shell_sort( int arr[], int n)
{
    int i ;   //循环变量
    int j;  //循环变量
    int d;  //增量
    int key;  //临时保存一个变量
    for(d=n/2;d>=1;d=d/2) //逐渐缩短“步长” ,最初分成n/2个组,步长逐渐减小,直至每一个元素为一组
    {
        //每一趟采用插入排序
        for(i=d;i<n;i++)      //i=d 将所分组的第二个元素往前插,因为第一个元素已经有序
        {
            key=arr[i];     //保存一下
            for(j=i ; j>=d  &&  key < arr[j-d]; j=j-d)
            {
                arr[j] = arr[j - d];
            }
            arr[j]=key;              //分组插入排序 和 普通的不一样
        }

    }
}
int main()
{
    int arr[]={2,3,5,2,3,1,6,7,4,5};
    shell_sort(arr,10);
    for(int i=0;i<10;i++)
    {
        cout<<arr[i]<<" ";
    }
}

快速排序


#include<iostream>
using namespace std;
int func( int arr[],  int left, int right)  //找到轴值(分界值),分割成两个子列,分别递归
{

    int temp = arr[left];
    while (left < right)
    {
        while ((left < right) && (arr[right] >= temp))
        {
            right -= 1;     //子列的右值指向左移
        }
        arr[left] = arr[right];     //在轴值右侧找到了比最左端小的数,放在最左端
        while ((left < right) && (arr[left] <= temp))
        {
            left += 1;    //子列的左值指向往右移
        }
        arr[right] = arr[left];     //在轴值左侧找到了比右侧的数,放在刚刚交换过的right那里
    }
    arr[right] = temp; //此时left = right   
    return left;     //此时left = right
}
void quick_sort(int *arr, int left, int  right)
{
    if (left < right)
    {
        int mid = func(arr, left, right);         //找到轴值(中值)
        quick_sort(arr, mid + 1, right);      //递归左子列
        quick_sort(arr, left, mid - 1);     // 递归右子列

    }
}
int main()
{
    int arr[11] = { 9,1,3,5,9,8,7,6,2,4,1 };

    quick_sort(arr, 0, 10);
    for (int i = 0; i < 11; i++)
    {
        cout << arr[i] << " ";
    }
}

归并排序
将序列中数字分为若干组,最后每个数字一组
将若干组两两合并,使之有序,直至合并成最后一组

#include<iostream>
using namespace std;
//合并arr[]数组下标为  s到m  和 m+1到t  两个部分
void merge(int arr[],int result[],int s,int m,int t)
{             //s是最左端,m是中间,t是最右端
    int i = s; //i指向r[s~m]
    int j = m+1; //j指向[m+1~t]
    int k = s; // k指向result
    while (i<=m && j<=t)
    {
        if (arr[i] < arr[j]) {
            result[k++] = arr[i++];    //取r[i]和r[j]中小者放入result[k]中
        } else
            result[k++] = arr[j++];
    }
    while (i<=m)
    {
        result[k++] = arr[i++];      //这两个while处理有更多的数的那一部分
    }
    while (j<=t)
    {
        result[k++]=arr[j++];
    }
}
void merge_sort(int arr[],int result[],int left,int right)
{
    if(left==right)
        result[left]=arr[right];
    else
    {
        int temp[11]; //辅助数组
        int mid=(left+right)/2;        //把数组平分
        merge_sort(arr,temp,left,mid); //递归将将arr[left~mid]归并为temp[left~mid]
        merge_sort(arr,temp,mid+1,right);//递归将将arr[mid~right]归并为temp[mid~right]
        merge(temp,result,left,mid,right);//递归将将temp[left~mid]和temp[mid~right]归并为result[left~right]
    }

}
int main()
{
    int arr[11] = { 9,1,3,5,9,8,7,6,2,4,1 };
    int result[11];
    merge_sort(arr,result, 0, 10);
    for (int i = 0; i < 11; i++)
    {
        cout << arr[i] << " ";
    }
    cout<<endl;
    for (int i = 0; i < 11; i++)
    {
        cout<<result[i]<<" ";
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值