C++中的快速排序(使用vector和数组的不同)

1.快速排序是最最基本的排序算法之一,时间复杂度是O(nlog2(n))

基本思想:分治法+递归

假设key为该序列的第一个元素,从后往前遍历,找到第一个小于key值的元素,将该元素赋值给左边的起始值,再从前往后遍历,找到第一个大于key值的元素,将其赋值给刚才右边第一个小于key值的值,当low<high,则不断递归,知道有序为止.

在用数组int num[]和C++的vector传递地址时,vector需要传引用,否则,没法得到正确地址,因为vector本质上是一个类对象,因此传值会得不到正确结果,而数组会退化为指针,因此可以直接传值.

template<typename datatype>
void myquicksort(vector<datatype> &vec, int low, int high)//必须传引用,否则出错,因为vector是一个类对象
{
    if (low < high)
    {
        int l = low;
        int r = high;
        datatype key = vec[l];//记录key值

        while (l < r)
        {
            while (l < r&&key <= vec[r])//从右往左遍历,找到第一个小于key的元素
                --r;
            vec[l] = vec[r];
            while (l < r&&key >= vec[l])//从左往右遍历,找到第一个大于key值的元素
                ++l;
            vec[r] = vec[l];
        }
        vec[l] = key;//其实此时l=r

        myquicksort(vec, low, l-1);
        myquicksort(vec, r + 1, high);
    }
}
int main2()
{
    const int len = 30;//定义一个常量
    vector<int>data;//创建一个vector,存储int类型的元素
    for (int i = 0; i < len; i++)
    {
        data.push_back(rand() % 100);
        cout << (data.at(i)) << "\t";
        if ((i + 1) % 10 == 0)
            cout << endl;
    }

    clock_t start = clock();//使用clock函数需要包含头文件#include<ctime>
    myquicksort(data, 0, len - 1);
    clock_t end = clock();
    cout << "排序完成,总共用时:" << (end - start)*1.0 / CLOCKS_PER_SEC << endl;//#define CLOCKS_PER_SEC  1000
    for (int i = 0; i < len; i++)
    {
        cout << (data.at(i)) << "\t";
        if ((i + 1) % 10 == 0)
            cout << endl;
    }

    system("pause");
    return 0;
}

2.使用数组来传值:

void myquicksort2(int a[], int low, int high)//数组作为函数参数,没有副本机制,退化为指针
{
    if (low >= high)//递归终止条件
        return;
    else
    {
        int l = low, h = high;
        int key = a[l];
        while (l<h)
        {
            while (l < h&&a[h] >= key)
                --h;
            a[l] = a[h];
            while (l < h&&a[l] <= key)
                ++l;
            a[h] = a[l];
        }
        a[l] = key;
        myquicksort2(a, low, l - 1);
        myquicksort2(a, l + 1, high);
    }
}
int main()
{
    const int len = 30;
    int num[len];
    for (int i = 0; i < len; i++)
    {
        num[i] = rand() % 100;
        cout << num[i] << "\t";
        if ((i + 1) % 10 == 0)
            cout << endl;
    }
    clock_t t1 = clock();
    myquicksort2(num, 0, len - 1);
    clock_t t2 = clock();
    cout << "排序完成,总共用时:" << (t2 - t1)*1.0 / CLOCKS_PER_SEC << endl;
    for (int i = 0; i < len; i++)
    {
        cout << num[i] << "\t";
        if ((i + 1) % 10 == 0)
            cout << endl;
    }
    system("pause");
    return 0;
}
时间: 2024-10-14 06:15:20

C++中的快速排序(使用vector和数组的不同)的相关文章

[转]STL中vector转数组(实际是数组的指针)

感谢:http://topic.csdn.net/t/20050429/20/3976956.html 感谢:http://yzyanchao.blogbus.com/logs/47796444.html 不过那边是转载自<effective stl>. std::vector很方便,但有时调用的函数的参数规定是数组,需要将vector转为数组,另外开辟一个空间,将vector一项项复制过去代价过大,可用下面的方法. 给定一个 vector<int>   v;         表达

vector代替数组

vector代替数组 1.声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除). 2.用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector <int *> a.同理想用向量代替三维数组也是一样,vector <int**>a;再往上面依此类推. 下面是另外一种vector代替二维数组的方

java中的快速排序

自己在网上找的,可以学学 快速排序 (1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分. (2)实例: (3)用java实现 public class quickSort { inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34

vector与数组的习惯用法

vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为了使用vector 我们必须包含相关的头文件  : #include <vector> 使用vector有两种不同的形式,即所谓的数组习惯和 STL习惯. 一.数组习惯用法 1. 定义一个已知长度的 vector : vector< int > ivec( 10 );  //类似数组定义int ia[ 10 ]; 可以通过ivec[索引号] 来访问元素 使用 

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

PHP中json_encode()使用须知,JSON数组和JSON对象

body { font: 12px/1.5 Tahoma, Arial, Helvetica, sans-serif } ? 偷偷的告诉你,这是一个很不谨慎就会踩得坑 ?  如下代码 (看了一下很简单,没毛病啊,老铁) $arr = array( '0'=>'a','1'=>'b','2'=>'c','3'=>'d' ); echo json_encode($arr); 但是结果是 ["a","b","c","d

jQuery中json对象的复制(数组及对象)

摘自: http://www.2cto.com/kf/201306/218838.html 1.jQuery自带的$.map方式: $.map(json, function (n) { return n; }); 这种方式原来用于复制数组还可以,今天用它复制数组中的某一条记录,发现字段名称丢失了,后来发现了第二种方法. 2.深复制与浅复制 // 浅层复制(只复制顶层的非 object 元素) var newObject = jQuery.extend({}, oldObject); // 深层复

如何将一个数组中的元素插入另一个数组

如何将一个数组中的元素插入另一个数组:本章节直接给出一段将一个数组中元素插入另一个数组中的代码实例,直接套用就可以了.代码如下: var first = ['a','b','c']; var second = ['1','2','3']; var index = 1; second.unshift(index, 0); Array.prototype.splice.apply(first, second); 原文地址是:http://www.softwhy.com/forum.php?mod=v

将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。

int a[3] = {12, 15, 17}; int b[4] = { 2, 8, 16, 22}; int c[7] = {0}; int i = 0, j = 0, k = 0; while (i < 3 && j < 4 ) { if (a[i] > b[j]) { c[k++] = b[j++]; } else { c[k++] = a[i++]; } } while (i < 3) { c[k++] = a[i++]; } while (j <