从100W个数中最快找出两个相同的数

#include <set>
#include <iostream>
#include <iterator>
using namespace std;
/*
 * 从100W个数中最快找出两个相同的数
 */
// 从set容器中查找
void method1()
{
    // windows下栈空间只有2M,所以得在heap下
    int * arr = new int[1000000];
    for( int i = 0; i < 1000000; ++i ) {
        arr[i] = i + 1;
    }
    arr[95342] = 100;
    cout << "start insert" << endl;
    set<int> si;
    int i;
    for( i = 0; i < 1000000; ++i ) {
        pair< set<int>::iterator, bool > pi = si.insert( arr[i] );
        if( !pi.second ) // 插入失败,这里就是这样的
            break;
    }
    cout << "end insert" << endl;
    int j;
    for( j = 0; j < i; ++j ) {
        if( arr[i] == arr[j] )
            break;
    }
    cout << "index: " << j << " value: " << arr[j] << endl;
    cout << "index: " << i << " value: " << arr[i] << endl;
    delete [] arr;
}
/*
 * 从100W个数中最快找出两个不同的数
 */
// 编程之美算法:异或算法
void findIsolateTwo( int * arr, int len, int * result )
{
    int i, all = 0, flag = 1;
    for( i = 0; i < len; ++i )    // 异或所有数
        all ^= arr[i];
    while( !( all & flag ) )      // 寻找过滤位,即为非0的位
        flag <<= 1;
    result[0] = result[1] = 0;
    for( i = 0; i < len; ++i ) {  // 利用过滤位区分
        if( flag & arr[i] )
            result[0] ^= arr[i];
        else
            result[1] ^= arr[i];
    }
}
void method2()
{
    // windows下栈空间只有2M,所以得在heap下
    int * arr = new int[1000000];
    for( int i = 0; i < 1000000; ++i ) {
        arr[i] = 1000;
    }
    arr[95342] = 22666666;
    arr[52481] = 41257625;
    int result[2] = {};
    // 不行,和预想不一样
    findIsolateTwo( arr, 1000000, result );
    cout << "value: " << result[0] << endl;
    cout << "value: " << result[1] << endl;
    delete [] arr;
}
int main(int argc, char *argv[])
{
    method1();
    method2();
    return 0;
}


 

好的,我知道了。这是一个排序综合问题,需要采用三种或以上的排序方法对随机产生的N个整进行排序,并统计每种排序方法的性能,找出较快的两种方法。 首先,我会生成N个随机整,大于等于20000。然后,我会依次采用插入排序、快速排序和归并排序三种方法进行排序,并将排序后的结果保存在不同的文件。下面是具体的实现过程: ```python import random import time N = 10000 # 需要排序的元素个数 MAX_NUM = 50000 # 随机的最大值 # 生成N个随机整 data = [random.randint(20000, MAX_NUM) for _ in range(N)] # 插入排序 start_time = time.time() for i in range(1, N): tmp = data[i] j = i - 1 while j >= 0 and data[j] > tmp: data[j + 1] = data[j] j -= 1 data[j + 1] = tmp end_time = time.time() print("插入排序耗时:", end_time - start_time) # 将排序结果保存到文件 with open("insertion_sort.txt", "w") as f: for d in data: f.write(str(d) + "\n") # 快速排序 def quick_sort(data, left, right): if left >= right: return pivot_idx = partition(data, left, right) quick_sort(data, left, pivot_idx - 1) quick_sort(data, pivot_idx + 1, right) def partition(data, left, right): pivot = data[left] while left < right: while left < right and data[right] >= pivot: right -= 1 data[left] = data[right] while left < right and data[left] < pivot: left += 1 data[right] = data[left] data[left] = pivot return left start_time = time.time() quick_sort(data, 0, N - 1) end_time = time.time() print("快速排序耗时:", end_time - start_time) # 将排序结果保存到文件 with open("quick_sort.txt", "w") as f: for d in data: f.write(str(d) + "\n") # 归并排序 def merge_sort(data): if len(data) <= 1: return data mid = len(data) // 2 left = merge_sort(data[:mid]) right = merge_sort(data[mid:]) return merge(left, right) def merge(left, right): i, j = 0, 0 res = [] while i < len(left) and j < len(right): if left[i] < right[j]: res.append(left[i]) i += 1 else: res.append(right[j]) j += 1 res += left[i:] res += right[j:] return res start_time = time.time() data = merge_sort(data) end_time = time.time() print("归并排序耗时:", end_time - start_time) # 将排序结果保存到文件 with open("merge_sort.txt", "w") as f: for d in data: f.write(str(d) + "\n") ``` 上述代码,插入排序、快速排序和归并排序都被实现了。其,插入排序通过依次将未排序的元素插入到已排序的序列,从而实现排序;快速排序使用递归的方式,将待排序序列分成两个子序列,然后对子序列进行排序;归并排序也是使用递归的方式,将待排序序列分成两个子序列,分别对子序列进行排序,然后将两个已排序的子序列合并。 在排序完成后,我会将排序结果保存在不同的文件。最后,我会统计每种排序方法的耗时,并找出较快的两种方法。可以使用time模块的time.time()方法来计算程序运行的时间。 如果需要使用四种或以上的排序方法,则可以适当增加代码实现即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值