排序和查找

普通的排序方法是依靠for的双重循环,时间复杂度为O(n^2)。而近段时间我学习了两种方法,在这里分享下。

一、c++中sort的函数

sort 的函数的头文件是#include<algorithm>.

sort()函数可以帮助我们把数组从小到大排列好,以int型数组为例:

这里我是直接将int型数组初始化,运行结果为:

显然这里的数组中元素的排序是杂乱无章的。通过sort()函数,我们可以这样写:

运行后结果为:

数组顺序都排列好了。

二、快排

其实快排的原理是运用了双指针,通过同时从数组的头和尾,来进行标记、交换来达到排序的目的。

i标记数组的第一个元素,j标记数组的最后一个元素。

这里的if(head > end )是判断如果数组只有一个元素,则返回和在递归中,程序结束的语句。不然会陷入死循环。

这里的temp是一个基点,用来划分数组两面数字的基准线。

在快排过程中,应该从最后一个元素(即j)开始:

在j这边,如果array[j]是大于等于temp,则j--,继续判断知道array[j]小于temp,此后i这边也是同理,直到array[i]是大于temp。此时i与j的位置没动,交换array[i]和array[j]元素的位置。

最后将第一个元素的位置与,i==j那个位置进行交换

然后利用递归再将准线两边的排序

函数完整代码如下:

void Qicksort(int array[], int head, int end)
{
    if (head >= end)
        return;
    int temp = array[head];
    int i = head;
    int j = end;
    while (i!=j)
    {
        while (array[j] >= temp&& i < j)
        {
            j--;
        }
        
        while (array[i] <= temp&& i < j)
        {
            i++;
        }

        if (i < j)
        {
            swap(array[i], array[j]);
        }
    }
    swap(array[head], array[i]);
    Qicksort(array, head, i - 1);
    Qicksort(array, i + 1, end);
}

三、插入排序

#include<bits/stdc++.h>
using namespace std;
void cp(int a[])
{
    int i = 0, j = 1;
    for (j = 1; j <= 4; j++)
    {
        int temp = 0;
        if(a[i] > a[j])
        {
            temp = a[j];
            while (temp < a[i])
            {
                a[i + 1] = a[i];
                i--;
            }
            a[i + 1] = temp;
        }
        i = j;
    }

}

int main()
{
    int a[5] = { 1,5,2,9,3 };
    cp(a);
    return 0;
}

四、选择排序

#include<bits/stdc++.h>
using namespace std;
#define INF 9999
void exchange(int i, int j, int a[])
{
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

void xp(int a[])
{
    int i, j;
    
    for (i = 0; i < 5; i++)
    {    
        int min = INF;
        int v = 0;
        for (j = i; j < 5; j++)
        {
            if (min > a[j])
            {
                min = a[j];
                v = j;
            }
        }
        exchange(i, v, a);
        cout << a[i] << " ";
    }

}



int main()
{
    int num[5] = { 1,9,5,4,3 };
    xp(num);
    return 0;
}

五、希尔排序


#include<bits/stdc++.h>
using namespace std;
int n;
void cp(int a[],int x,int len)
{
    int temp = a[x];
    while (x - len >= 0 && temp < a[x - len])
    {
        a[x] = a[x - len];
        x = x - len;
    }
    a[x] = temp;

}


void xrp(int a[], int len,int t)
{
    for (int i = 0; i < n / t; i++)
    {
        int x = i;
        while (x < n)
        {
            if (a[x] >= a[x - len] || x-len < 0)
                x = x + len;
            else
            {
                cp(a, x, len);
                x += len;
            }
        }

    }

    for (int i = 0; i < 8; i++)
        cout << a[i] << " ";
    cout << endl;
}

int main()
{
    n = 8;
    int a[8] = { 1,5,8,4,7,2,6,3 };
    int len = n / 2;
    int i = 2;
    while (len >= 1)
    {
        xrp(a, len, i);
        len /= 2;
        i++;
    }
    
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值