快速排序

217. Contains Duplicate

思路:

1:暴力点从开始位置一个个对比,一轮完了,下一个继续。两个for循环搞定,结果这个速度惊人。O(n2)的算法确实很恐怖。

2:排序后,遍历,判断相邻位置是否有相同的。排序这里就用快速排序,稳定。有些生疏了,就重新复习下。

附上算法导论的快速排序思路:

对应这敲了下代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void swap(int *a, int *b)
{
    if(a == b){
        return;
    }
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
    return;
}


int partition(int *A, int p, int r)
{
    int i;
    int j;
    int x;

    x = A[r-1];
    i = p-1;
    for(j = p; j < r-1; j++){
        if(A[j] <= x){
            i++;
            swap(&A[i], &A[j]);   
        }
    }
    swap(&A[i+1], &A[r-1]);
    return i + 1;
}


void quick_sort(int *A, int p, int r)
{
    int q;
    if(p < r){
        q = partition(A, p, r);
        quick_sort(A, p, q);
        quick_sort(A, q+1, r);
    }
    return;
}


void main(void)
{
    int i;
    int test[] = {1, 3, 23, 4, 9, 1000, 5, 2};
    int r = sizeof(test)/sizeof(test[0]);

    for(i = 0; i < r; i++){
        printf("%d ", test[i]);
    }
    printf("\n");
    quick_sort(test, 0, r);
    for(i = 0; i < r; i++){
        printf("%d ", test[i]);
    }
    printf("\n");
}

这里要注意下数组的下标。算法导论的伪代码是从1开始的。

当然实际应用中的话,是用不着自己写快速排序的。直接调用glibc中的接口即可,其性能比自己写的强多了。

man qsort了解下,这里就不贴了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值