Random Quick Sort Test

140 篇文章 0 订阅
111 篇文章 0 订阅
#include"MyOutput.hpp"


template<typename T>
int partition(T a[],int p,int r){
    
    T x = a[p];//将首元素设置为哨兵
    int i=p+1;//从首元素的下个元素开始比较
    int j=r;
    

    //这里先++i,++j增(减)再比,很重要
    while(true){
        //不要a[i++]或a[j--]执行后,i会+1,j会-1,造成swap 数据 错误.
        while( x > a[i] && i < j){
            i++;
        }
        while( x < a[j]){
            j--;
        }
        if(i>=j)break;
        swap(a+i,a+j);
        /**
         * 对于重复的数字:如 9 9 9 8 10
         * 如果不 i++ 和 j--
         * 将重复 9 比较 9 
         * 因为 以上循环中 是先比较 > < 不是 <= >=,再次+1 -1,
         * 
         * 会不会 越界 呢 ? 如 i++ 后 i > n,j--后 j<0 
         * 5 4 3 2 1 ; x = 5, i = 1 , arr[i++] < x;约束 i < j ,所以 最终 i = j = 4; arr[j=4] < x;
         * i>=j (4>=4) break;arr[j=4] = x = 5;arr[0] = 1;return j=4;
         * 
         * 6 7 8 9 10; x = 6, i = 1 , arr[i] > 6, j = 4,a[j--] > x => j = 0 (6 > 6)
         * i>=j (1>=0) break; a[p=0] = a[j=0]; a[j=0] = x (=a[p]),return j=0;
         * 
         * 
         * 
         */ 
        i++;
        j--;
        // println("i=",i," ; j=",j);
    }
    
    a[p] = a[j];
    a[j] = x;
    // println(j);
    return j;
}

template<typename T>
int randomizedPartition(T a[],int p,int r){
    srand(time(nullptr));
    int i = rand()%(r-p + 1) + p;
    swap(a+i,a+p);//与首元素交换,这样就不用修改patition的code了
    return partition(a,p,r);
}

//ASC
template<typename T>
void RandomizedQuickSort(T a[],int p,int r){
    if(p<r){
        
        int q = randomizedPartition(a,p,r);
        // printlnArr(a,10);
        // println(q);
        RandomizedQuickSort(a,p,q-1);
        RandomizedQuickSort(a,q+1,r);
    }
}


int main(){

    constexpr int len = 10000;
    int a[len] = {0};
    createRandomArrayWithBase(a,len,len);
    // printlnArr(a,len);
    TimeSpec::begin();
    RandomizedQuickSort(a,0,len-1);
    TimeSpec::print_cost_time();
    // printlnArr(a,len);
    println("======================================");
    constexpr int len2 = 100;
    int b[len2] = {0};
    createRandomArrayWithBase(b,len2,len2);
    printlnArr(b,len2);
    TimeSpec::begin();
    RandomizedQuickSort(b,0,len2-1);
    TimeSpec::print_cost_time();
    printlnArr(b,len2);


    return 0;
}

From beginning to end totally costs: 0.002 s
======================================
[29,12,8,14,17,6,69,16,65,7,38,93,8,17,93,46,83,79,74,60,54,58,51,35,41,96,64,6,30,89,88,8,78,57,48,92,14,29,32,4,71,4,3,30,71,26,30,8,95,84,21,51,38,87,6,98,75,14,82,68,26,5,22,62,74,40,41,77,71,50,70,99,34,54,64,44,90,91,20,72,54,88,19,59,26,39,0,33,22,13,60,51,60,26,73,85,58,93,8,4]
From beginning to end totally costs: 0 s
[0,3,4,4,4,5,6,6,6,7,8,8,8,8,8,12,13,14,14,14,16,17,17,19,20,21,22,22,26,26,26,26,29,29,30,30,30,32,33,34,35,38,38,39,40,41,41,44,46,48,50,51,51,51,54,54,54,57,58,58,59,60,60,60,62,64,64,65,68,69,70,71,71,71,72,73,74,74,75,77,78,79,82,83,84,85,87,88,88,89,90,91,92,93,93,93,95,96,98,99]








好的,我将用Python实现三个排序法:冒泡排序,快速排序和堆排序,并绘制一张图表展示不同大小的输入数组下这些排序法的运行时间。 以下是实现这三个法的Python代码: ```python import random import time # 冒泡排序 def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # 快速排序 def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[0] left = [x for x in arr[1:] if x < pivot] right = [x for x in arr[1:] if x >= pivot] return quick_sort(left) + [pivot] + quick_sort(right) # 堆排序 def heapify(arr, n, i): largest = i l = 2 * i + 1 r = 2 * i + 2 if l < n and arr[largest] < arr[l]: largest = l if r < n and arr[largest] < arr[r]: largest = r if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heap_sort(arr): n = len(arr) for i in range(n//2 - 1, -1, -1): heapify(arr, n, i) for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) # 测试排序法的运行时间 def test_sorting_algorithm(algorithm, arr): start_time = time.time() algorithm(arr) end_time = time.time() return end_time - start_time # 绘制排序法的运行时间图表 def plot_running_time(): sizes = [100, 500, 1000, 5000, 10000, 50000, 100000] bubble_sort_times = [] quick_sort_times = [] heap_sort_times = [] for size in sizes: arr = [random.randint(0, 1000) for _ in range(size)] bubble_sort_times.append(test_sorting_algorithm(bubble_sort, arr)) quick_sort_times.append(test_sorting_algorithm(quick_sort, arr)) heap_sort_times.append(test_sorting_algorithm(heap_sort, arr)) import matplotlib.pyplot as plt plt.plot(sizes, bubble_sort_times, label='Bubble Sort') plt.plot(sizes, quick_sort_times, label='Quick Sort') plt.plot(sizes, heap_sort_times, label='Heap Sort') plt.xlabel('Input size') plt.ylabel('Running time (seconds)') plt.title('Running time of sorting algorithms') plt.legend() plt.show() plot_running_time() ``` 上面的代码中,我们使用了Python的标准库`random`来生成随机数数组。`test_sorting_algorithm`函数用来测试给定排序法在给定数组上的运行时间。`plot_running_time`函数则用来绘制排序法的运行时间图表,它调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值