zoukankan      html  css  js  c++  java
  • 剑指offer—第二章算法之快速排序

    算法:排序和查找(二分查找,归并排序,快速排序),位运算等。

    查找:顺序查找,哈希查找,二叉排序树查找,哈希表。

    二分查找可以解决:"旋转数组中的最小数字","数字在排序数组出现的次数"等问题。

    哈希表:优点:O(1)时间内查找一个元素的效率最高。

               缺点:需要额外的空间来实现哈希表。

    二叉排序树查找:对应二查搜索树查找,可以解决:"二叉收索树的后续遍历","二查搜索树和双向链表"

    排序:排序算法要熟练,额外空间消耗,平均时间复杂度和最差时间复杂度比较算法直接的优缺点。

    快速排序:总体平均效率最好,但是并不总是,对于已排好序的数组,每一轮排序都要以最后一个做标准。时间复杂度为O(n2)

    思路:关键在于在数组中选择一个数字a(随机选择),把数组中小于a的数移到a的左边,大于a的数移到a的右边。

    实现函数为int partition(int a[],int length,int start,int end){如果length小于等于0或start小于等于0或end大于length或a为空。抛空异常。用int RandomInRange(int start,int end){如果end>start{srand(time(NULL)),return start+rand()%(end-start)}}随机生成函数,生成index。用void swap_element(int *a,int*b)来交换,index和end处的值。定义一个整形变量small(指向最终存放最初的index指向的枢纽值),并初始化。将index初始化并赋值为start。当index满足index<end时,if(a[index]<a[end]){++small;if(index!=small)交换index和small处得 值。并将index++。}。++small,将比枢纽值小的数都放在了此时small指针的前面,交换end和small处的值。}

    partition函数可以用于解决:长队为n数组中查找第K大的数字或最小的K个数,或者数组中出现次数超过一半的数字。

    实现快排的函数为 void QuickSort(int a[],int length,int start,int end){如果start==end。返回空。通过partition函数确定第一趟排序后枢纽值index的位置。if(index>start)递归调用QuickSort对左边排序。if(index<end)递归调用QuickSort对右边排序。}

    #include<iostream>
    using namespace std;
    #include<time.h>
    int RandomInRange(int start ,int end)
    {
    	if(end>start)
    	{
    	  srand(time(NULL));// srand函数是随机数发生器的初始化函数,使得随机数种子随时间的变化而变化
    	  return start+rand() %((end-start));//产生start~end之间的随机数
    	}
    	return 0;
    }
    void swap_element(int *a,int *b)
    {
    	int temp;
    	temp=*a;
    	*a=*b;
    	*b=temp;
    }
    
    int Partition(int data[],int length,int start,int end)
    {
    	if(data==NULL || length<=0||start<0 || end>=length)
    	{
    		cout<<"error1!"<<endl;
    		exit(0);
    	}
    	int index=RandomInRange(start,end);
    
    	swap_element(&data[index],&data[end]);
        int small=start-1;
        for(index=start;index<end;index++)
    	{
    	   if(data[index]<data[end])
    		{
    	             ++small;
    		    if(small != index)
    			{
    				swap_element(&data[index],&data[small]);
    			}
    		}
    	}
    	++small;
        swap_element(&data[small],&data[end]);
    	return small;
    }
    void Quicksort(int data[],int length,int start,int end)
    {
    	if(start==end)
    	{
    		return ;
    	}
    	int index=Partition(data,length,start,end);
    	if(index>start)
    	    Quicksort(data,length,start,index-1);
    	if(index<end)
    		Quicksort(data,length,index+1,end);
    }
    int main(void)
    {
    	int data[10]={1,4,7,0,6,10,3,8,2,9};
    	Quicksort(data,10,0,9);
    	for(int i=0;i<10;i++)
    		cout<<data[i]<<" ";
    	cout<<endl;
    	return 0;
    }
    
  • 相关阅读:
    我今天能懂
    SpringMVC之RequestContextHolder分析
    idea只导入部分依赖
    idea中GitPush失败问题
    SpringBoot常用配置,引入外部配置文件信息,热加载
    idea的yml文件不识别问题
    SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解
    Java连接Redis,存储对象获取对象()byte和json),连接池
    Nginx的反向代理
    Nginx介绍,安装,配置
  • 原文地址:https://www.cnblogs.com/hupp/p/4513042.html
Copyright © 2011-2022 走看看