快速排序,冒泡排序,选择排序

快速排序,冒泡排序,选择排序是比较基础的排序方法,我通过随机生成一个大小1000的数组,然后使用内部类创建线程来比较耗费时间

首先快速排序算法:

快速排序算法其实也叫分治法, 其步骤大致可以分为这么几步:

1. 先从数列中取出一个数作为基准数Num(取得好的话, 是可以减少步骤的)

2. 分区, 将大于Num的数放在它的右边, 小于或等于它的数放在它的左边

3. 再对左右区间重复前两操作, 直到各个区间只有一个数为止.

  这里是使用递归方式创建的快速排序


1publicstaticvoidkspxSort(int[] a,intlow,int hight) { 2intstart=low; 3intend=hight; 4intkey=a[low]; 5while(end>start) { 6//从end开始和key比较 7while(end>start&&a[end]>=key) { 8end--; 9            }10if(a[end]<=key) {11inttemp = a[end];12a[end] = a[start];13a[start] = temp;                    14            }15while(end>start&&a[start]<=key) {16start++;1718            }19if(a[start]>=key) {20inttemp = a[start];21a[start]=a[end];22a[end]=temp;23            }242526        }2728//递归调用29if(start>low) {kspxSort(a,low,start-1);}30if(end

 然后是冒泡排序

将要排序的一组数字进行遍历。

第一次遍历,将相邻的两个数字进行比较,直到这组数字全部比较完成,如果前面比后面的数字大,则进行交换位置,此时可以将最大的数字筛选出来,放到最后的位置上。

第二次遍历,将相邻的两个数字进行比较,直到这组数字全部比较完成,如果前面比后面的数字大,则进行交换位置,将这组数字里面第二大的数字筛选出来,放到倒数第二的位置上。

依次进行遍历,交换位置,直到排序完成。

1publicstaticvoidbubbleSort(int[] a) { 2intn = a.length; 3int temp; 4for(inti=0;ia[j+1]) { 9temp = a[j];10a[j] =a[j+1];11a[j+1] = temp;12                }13            }14        }        15}

然后是选择排序

将要排序的一组数字进行遍历。

第一次遍历,将第一个位置上的数字与后面的数字进行比较,如果后面的数字比第一个位置上的元素小,则将两个数字的位置进行交换。

第二次遍历,将第二个位置上的数字与后面的数字进行比较,如果后面的数字比第二个位置上的元素小,则将两个数字的位置进行交换。

依次进行遍历、位置交换,直到这组数字排序完成。

1publicstaticvoidselectSort(int[] a) { 2for(inti=0;ia[j]){11//给min重新赋值12min = j;13                    }14                }1516//交换位置17if(min != i){18int temp;19temp = a[i];20a[i] = a[min];21a[min] = temp;22                }2324            }25}


然后再main方法主线程中中创建一个随机数组,大小100000;读者可以创建更大以便获得更好的效果;

1int[] arry=newint[100000];    2for(inti=0;i<100000;i++) {3arry[i]= (int)(Math.random()*100000);4}

     使用多线程调用


1newThread() {// 1.继承Thread类 2publicvoidrun() {// 2.重写run方法 3longt1 =new Date().getTime(); 4kspxSort(arry, 0, arry.length-1); 5longt2 =new Date().getTime(); 6System.out.println("快速排序消耗时间:"+(t2-t1)); 7                } 8}.start();// 4.开启线程 9new Thread() {10publicvoid run() {11longt1 =new Date().getTime();12                bubbleSort(arry);13longt2 =new Date().getTime();14System.out.println("冒泡排序消耗时间:"+(t2-t1));15            }16        }.start();17new Thread() {18publicvoid run() {19longt1 =new Date().getTime();20                selectSort(arry);21longt2 =new Date().getTime();22System.out.println("选择排序消耗时间:"+(t2-t1));23            }2425}.start();


结果如下:

快速排序消耗时间:33

选择排序消耗时间:2515

冒泡排序消耗时间:4227

相比较之下:快速排序最快,选择排序和冒泡排序相差不大,

在算法中用 0()函数 表示算法的时间效率与算法所处理的数据元素个数n函数关系的最常用函数是0()函数。

定义:

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,

T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=0(f(n)),称0(f(n)) 为算法的渐进时间复杂度,简称时间复杂度

   对比三种算法,具体请看https://cloud.tencent.com/developer/article/1350860

   首先冒泡排序是基于比较和交换的,比如我们要对n个数字排序,冒泡排序需要n-1次遍历,比如我们有10个数字,第一趟循环需要比较9次,第二趟循环需要比较8次,第三趟需要比较7次,以此类推,最后一趟需要1次比较。

f(10)=9+8+7+......+1 ,可以转为一个等差数列:

f(n)=(n-1)+(n-2)+(n-3)+......+1= (n-1)*n / 2 = 0.5n^2-0.5n

当n趋于无穷大时否f(n)=n^2/2

 选择排序类似,但是最坏情况下,选则排序需要交换n-1次,冒泡排序需要交换n^2/2

快速排序

     快速排序的递推式为:T(n)=max(T(q) + T(n-q-1)) +O(n),q为切分长度,如果每次切分都刚好切分成两半,则 q==n-q-1, T(q)==T(n-q-1) ,则简化为 T(n)=2T(n/2)+O(n)。换一下加法项的位置,T(n)=O(n)+2T(n/2),若 快速排序每次都会以2为低做裂变分解数组,所以最终推出来的渐近复杂度:Ο(nlog2n)

转载于:https://www.cnblogs.com/fmlyzp/p/10370470.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容