zoukankan      html  css  js  c++  java
  • 高速排序

    排序思想:每次把排序区间的第一个元素作为基准,把此区间内比基准大的元素放在基准右边,比基准小的元素放在基准左边(从小到大排序)。

    性能分析:(1)从空间复杂度方面。高速排序是递归的。每层递归调用时的指针和參数均要用栈来存放。递归调用次数与二叉树的深度一致。因此,在理想情况下,即每一趟排序都将记录序列均匀的分隔成长度接近的两个子序列,则须要栈空间为O(logn);在最坏情况下,即每趟排序之后,基准元素位置均偏向子序列的一端,此时二叉树是一个单链。则须要的栈空间为O(n)。(2)从时间复杂度方面,高速排序在普通情况下是效率非常高的排序方法。

    在理想情况下,时间复杂度为O(nlongn);在最坏情况下。时间复杂度为O(n^2)。

    注意:高速排序是一种不稳定的排序方法。如序列(4,3,6,3)排序之后序列为(3,3,4,6)。

    #include<stdio.h>
    int a[1000], sum;
    int Partition(int low, int high)
    {
        int tmp = a[low];
        a[0] = a[low];
        while(low < high)
        {
            while(low < high && a[high] >= tmp) --high;
            a[low] = a[high];
            while(low < high && a[low] <= tmp) ++low;
            a[high] = a[low];
        }
        a[low] = a[0];
        return low;
    }
    void QuickSort(int low, int high)
    {
        sum++;
        //printf("Sort: %d -> %d
    ", low, high); //记录递归排序的区间
        if(low < high)
        {
            int loc = Partition(low, high);
            //printf("loc = %d
    ", loc);
            QuickSort(low, loc-1);
            QuickSort(loc+1, high);
        }
    }
    int main()
    {
        int n, i;
        while(~scanf("%d",&n))
        {
            sum = 0;  //递归次数
            for(i = 1; i <= n; i++)
                scanf("%d",&a[i]);
            QuickSort(1, n);
            for(i = 1; i < n; i++)
                printf("%d ", a[i]);
            printf("%d
    ", a[n]);
            //printf("sum = %d
    ", sum-1);
        }
        return 0;
    }


  • 相关阅读:
    Windows dll注入
    Android获取ROOT权限的通用方法
    Android odex,oat文件的反编译,回编译
    盘点那些适配Linux的国产常用软件
    Hook Java API以获得MD5加密前数据
    修改Android源码实现原生应用双开,应用多开
    让终端更好看--Ubuntu OhMyZsh配置指南
    (二) go语言设计模式-创建模式之抽象工厂模式(Abstract Factory)
    (一) go语言设计模式概述
    j2ee高级开发技术课程第十四周
  • 原文地址:https://www.cnblogs.com/llguanli/p/8494619.html
Copyright © 2011-2022 走看看