算法学习---关于快速排序,数据呈现基本有序和完全无序时候导致的时间复杂度增n^2的解决方案
2017-01-16 23:33
393 查看
前言--------------------
经过了一段考研学习,也该是时候准备准备复试或者准备今后的工作面试了,那么对于我之前喜欢暴力解法的初级童鞋来说,在算法学习中其实挺迷茫的,所以就想借助写个博客加深对算法学习的深刻,希望有看到的大神多多指教,嘿嘿,下面直接来代码。
快排中时间复杂度增大解决方案
我们采取随机取主元对每个区间进行大小分隔,其时间复杂度虽然为o(n^2) ,但其对任意输入数据的期望时间复杂度都能达到o(nlogn);
#include<cstdio>
#include<stdlib.h>
#include<time.h>
#include<math.h>
//快速排序 针对有序 反序的 改进的
const int maxn=100;
int a[maxn];
int randPartition(int a[],int left,int right){
void swap(int a,int b);
int p=(round((1.0*rand()/RAND_MAX*(right-left)+left)));
int tmep1=a[left];
a[left]=a[p];
a[p]=tmep1;
int temp=a[left];
while(left<right){
while(left<right && temp<a[right]) --right;
a[left]=a[right];
while(left<right && a[left]<=temp) ++left;
a[right]=a[left];
}
a[left]=temp;
return left;
}
void quickSort(int a[], int left ,int right){
if(left<right){
int mid=randPartition(a,left,right);
quickSort(a,left,mid-1);
quickSort(a,mid+1,right);
}
}
int main(){
srand((unsigned)time(NULL));
printf("please enter the number you want : \n");
int n;
scanf("%d",&n);
printf("you will enter %d numbers : \n",n);
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
}
printf("now, i am computing...\n");
quickSort(a,0,n-1);
for(int i=0;i<n;++i){
printf("%d ",a[i]);
if(i!=0 && i%9==0){
printf("\n");
}
}
return 0;
}
这是我人生中第一篇博客,希望大家多多指教了。
经过了一段考研学习,也该是时候准备准备复试或者准备今后的工作面试了,那么对于我之前喜欢暴力解法的初级童鞋来说,在算法学习中其实挺迷茫的,所以就想借助写个博客加深对算法学习的深刻,希望有看到的大神多多指教,嘿嘿,下面直接来代码。
快排中时间复杂度增大解决方案
我们采取随机取主元对每个区间进行大小分隔,其时间复杂度虽然为o(n^2) ,但其对任意输入数据的期望时间复杂度都能达到o(nlogn);
#include<cstdio>
#include<stdlib.h>
#include<time.h>
#include<math.h>
//快速排序 针对有序 反序的 改进的
const int maxn=100;
int a[maxn];
int randPartition(int a[],int left,int right){
void swap(int a,int b);
int p=(round((1.0*rand()/RAND_MAX*(right-left)+left)));
int tmep1=a[left];
a[left]=a[p];
a[p]=tmep1;
int temp=a[left];
while(left<right){
while(left<right && temp<a[right]) --right;
a[left]=a[right];
while(left<right && a[left]<=temp) ++left;
a[right]=a[left];
}
a[left]=temp;
return left;
}
void quickSort(int a[], int left ,int right){
if(left<right){
int mid=randPartition(a,left,right);
quickSort(a,left,mid-1);
quickSort(a,mid+1,right);
}
}
int main(){
srand((unsigned)time(NULL));
printf("please enter the number you want : \n");
int n;
scanf("%d",&n);
printf("you will enter %d numbers : \n",n);
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
}
printf("now, i am computing...\n");
quickSort(a,0,n-1);
for(int i=0;i<n;++i){
printf("%d ",a[i]);
if(i!=0 && i%9==0){
printf("\n");
}
}
return 0;
}
相关文章推荐
- 关于快速排序和插入排序最坏时间复杂度为O(nlogn)的算法
- 【数据结构与算法学习笔记】PART2 向量(接口与实现,可扩充向量,无序向量,有序向量)
- 数据结构与算法学习笔记——算法的时间和空间复杂度
- 算法兴趣----- 一亿数据获取前100个最大值(仅供参考,基于快速排序的实现时间不稳定,基于最小堆实现。如果我们只要求前K个最大(小)值的时候,用堆是最好的选择,因为这里不用每次都排序了)
- 关于基本排序的总结选择排序: 算法是: ① 第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换。 ③第i趟排序 第i趟排序开始时,当前有序区和无序区
- 数据结构(一):数据结构的基本概念和算法的时间和空间复杂度
- 每天学习一算法系列(3)(设计包含min函数的栈,要求函数min、push以及pop的时间复杂度都是O(1))
- WCF学习:关于数据类(DataContract)中逻辑方法或复写方法未被初始化的原因及解决方案
- SQL SERVER 2005 数据挖掘与商业智能完全解决方案---学习笔记(五)
- 考试笔记03_数据结构_基本算法复杂度
- [WP]WindowsPhone7团购小程序4-关于mainpage载入时候加载数据导致的UI流畅性改进
- n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j|<=K,请设计一种排序算法,对该序列进行排序。注:算法时间复杂度为O(nlgn)的得0分,复杂度为O(nk) 的得两分,总分是20分
- SQL SERVER 2005 数据挖掘与商业智能完全解决方案---学习笔记(二)
- SQL SERVER 2005 数据挖掘与商业智能完全解决方案---学习笔记(二)
- 关于分区有序数据merge的解决方案
- 数据挖掘算法的空间复杂度与时间复杂度分析
- 算法面试题——两个有序数组,将一个数组放入另一个空间很大的数组,要求合并之后依然有序,时间复杂度要求最小,不使用额外的数组。
- SQL SERVER 2005 数据挖掘与商业智能完全解决方案---学习笔记(四)
- SQL SERVER 2005 数据挖掘与商业智能完全解决方案---学习笔记(四)
- 《SQL Server 2005数据挖掘与商业智能完全解决方案》学习笔记(1/12-3/12)