百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

快速排序算法 快速排序算法在最好情况下的时间复杂度为

yuyutoo 2024-10-12 01:09 5 浏览 0 评论

干货来了,干货来了,清华北大的程序员,甚至对每一个程序来说都要掌握的排序算法,下面我们来讲解下快速排序算法。

快速排序(quick sort)是由C.A.R Hoarse提出的一种排序算法,它是冒泡排序的一种改进算法。由于快速排序算法元素之间的比较次数较少,速度较快,因而得名快速排序。在各种内部排序方法中,快速排序被认为是目前最好的一种排序方法。

快速排序算法的基本思想是:在当前的排序序列(k1,k2,…kn)中任意选取一个元素,把该元素称为基准元素或支点,把小于等于基准元素的所有元素都移到基准元素的前面,把大于基准元素的所有元素都移到基准元素的后面,这样使得基准元素所处的位置恰好就是排序的最终位置,并且把当前参加排序的序列划分为前后两个子序列。

源代码:

#include "stdio.h"
void swap(int *a,int *b)
{							/*序列中元素位置的交换*/
  int tmp;
  tmp = *a;
  *a = *b;
  *b = tmp;
}
void quicksort(int k[], int s,int t)
{							/*快速排序*/
    int i,j;
    if(s<t){
        i = s;
        j = t+1;
        while(1){
            do i++;
            while(!(k[s]>=k[i] || i==t));		/*重复执行i++操作*/
            do j--;
            while(!(k[s]<=k[j] || j==s));		/*重复执行j--操作*/
            if(i<j)
                swap(&k[i],&k[j]);				/*交换k[i]和k[j]的位置*/
            else
                break;
        }
        swap(&k[s],&k[j]);				/*交换基准元素与k[j]的位置*/
        quicksort(k,s,j-1);				/*递归排序基准元素前面的子序列*/
        quicksort(k,j+1,t);				/*递归排序基准元素后面的子序列*/
    }
}
main()
{
    int k[10]={2,5,6,3,7,8,0,9,12,1} , i;
    printf("The orginal data array is\n") ;
    for(i=0;i<10;i++)						/*显示原序列之中的元素*/
        printf("%d ",k[i]);
    quicksort(k,0,9);						/*快速排序*/
    printf("\nThe result of quick sorting for the array is\n");
    for(i=0;i<10;i++)						/*显示排序后的结果*/
        printf("%d ",k[i]);
    getche();
}

运行结果

源代码:
typedef int keytype;
void adjust(keytype k[],int i,int n)
{
    int j;
    keytype tmp;
    tmp = k[i];
    j = 2 * i;
    while(j<=n)
    {
        if(j<n && k[j]>k[j+1])
        {
            j++;					/* j为i的左右孩子中较小孩子的序号*/
        }
        if(tmp<=k[j])
        {
            break;				/*tmp为最小的元素,则不需要元素的交换*/
        }
        k[j/2] = k[j];			/*交换元素位置*/
        j = 2 * j;
    }
    k[j/2] = tmp;
}
void heapsort(keytype k[],int n)
{
    int i;
    keytype tmp;
    for(i=n/2;i>=1;i--)
    {
        adjust(k,i,n);			/*将原序列初始化成一个小顶堆*/
    }
    for(i=n-1;i>=1;i--)
    {
        tmp = k[i+1];			/*调整序列元素*/
        k[i+1] = k[1];
        k[1] = tmp;
        adjust(k,1,i);
    }
}
main()
{
    int i,k[11]= {-111,5,2,12,6,9,0,3,6,15,20};
        printf("The orginal data array is\n") ;
    for(i=1;i<=10;i++)                        /*显示原序列之中的元素*/
        printf("%d ",k[i]);
    heapsort(k,10);                         	/*堆排序*/
    printf("\nThe result of quick sorting for the array is\n");
    for(i=1;i<=10;i++)                       	/*显示排序后的结果*/
        printf("%d ",k[i]);
    getche();
}

执行结果:

相关推荐

国内外注塑机及电脑密码大全(常见注塑机通用密码)

一、国外注塑机(日本、德国等)东洋注塑机万能码:9422345日精注塑机密码:222|7777DAMEG注塑机密码:000000000新泻注塑机密码:241650|261450住友注塑机密码:...

并发编程实战来咯(并发编程的艺术和并发编程实战)

提到并发编程,就不得不提C++ConcurrencyinAction(SecondEdition)(《C++并发编程实战第2版》)啦!《C++并发编程实战第2版》英文原版&中文译版看到这个...

无锁队列Disruptor原理解析(无锁队列应用场景)

队列比较队列...

理解 Memory barrier(内存屏障)(内存屏障 volatile)

...

并发编程 --- CAS原子操作(cas概念、原子类实现原理)

...

无锁CAS(附无锁队列的实现)(cas是一种无锁算法)

本文所有代码对应的Github链接为:https://github.com/dongyusheng/csdn-code/tree/master/cas_queue...

Linux高性能服务器设计(linux 服务器性能)

C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...

浅谈Go语言的并发控制(go语言 并发)

前言本文原创,著作权归...

Datenlord |Etcd 客户端缓存实践(etcd 数据存储)

简介和背景...

无锁编程——从CPU缓存一致性讲到内存模型

缓存是一个非常常用的工程优化手段,其核心在于提升数据访问的效率。缓存思想基于局部性原理,这个原理包括时间局部性和空间局部性两部分:...

打通 JAVA 与内核系列之 一 ReentrantLock 锁的实现原理

...

如何利用CAS技术实现无锁队列(cas会锁总线吗)

linux服务器开发相关视频解析:...

Kotlin协程之一文看懂Channel管道

概述Channel类似于Java的BlockingQueue阻塞队列,不同之处在于Channel提供了挂起的send()和receive()方法。另外,通道Channel可以...

详解C++高性能无锁队列的原理与实现

1.无锁队列原理1.1.队列操作模型...

Javascript 多线程编程的前世今生

...

取消回复欢迎 发表评论: