C浠g爜錛?br />聽1聽#include聽<stdio.h>
聽2聽#include聽<stdlib.h>
聽3聽int聽new_random(int聽min,聽int聽max)
聽4聽{
聽5聽聽聽聽聽return聽(min聽+聽(int)(((float)rand()/RAND_MAX)*(max聽-聽min)));
聽6聽}
聽7聽void聽swap(int聽*a,聽int聽*b)
聽8聽{
聽9聽聽聽聽聽int聽c聽=聽*a;
10聽聽聽聽聽*a聽=聽*b;
11聽聽聽聽聽*b聽=聽c;
12聽}
13聽
14聽int聽partition(int聽A[],聽int聽p,聽int聽r)
15聽{
16聽聽聽聽聽int聽i聽=聽p聽-聽1,聽j;
17聽聽聽聽聽for(j聽=聽p;聽j聽<聽r;聽j++)
18聽聽聽聽聽{
19聽聽聽聽聽聽聽聽聽if(A[j]聽<=聽A[r])
20聽聽聽聽聽聽聽聽聽{
21聽聽聽聽聽聽聽聽聽聽聽聽聽i++;
22聽聽聽聽聽聽聽聽聽聽聽聽聽swap(&A[i],聽&A[j]);
23聽聽聽聽聽聽聽聽聽}
24聽聽聽聽聽}
25聽聽聽聽聽swap(&A[i聽+聽1],聽&A[r]);
26聽聽聽聽聽return聽i聽+聽1;
27聽}
28聽
29聽int聽randomize_partition(int聽A[],聽int聽p,聽int聽r)
30聽{
31聽聽聽聽聽int聽i聽=聽new_random(p,聽r);
32聽聽聽聽聽swap(&A[i],聽&A[r]);
33聽聽聽聽聽return聽partition(A,聽p,聽r);
34聽}
35聽
36聽//絎竴縐嶇畻娉?/span>
37聽int聽randomized_select(int聽data[],聽int聽p,聽int聽r,聽int聽k)
38聽{
39聽聽聽聽聽if(k聽>聽(r聽-聽p聽+聽1))聽return聽0;
40聽聽聽聽聽if(p聽==聽r)聽return聽data[p];
41聽聽聽聽聽int聽i聽=聽randomize_partition(data,聽p,聽r);
42聽聽聽聽聽//int聽i聽=聽partition(data,聽p,聽r);
43聽
44聽聽聽聽聽int聽count聽=聽i聽-聽p聽+聽1;
45聽聽聽聽聽if(k聽<=聽count)
46聽聽聽聽聽聽聽聽聽return聽randomized_select(data,聽p,聽i,聽k);
47聽聽聽聽聽else
48聽聽聽聽聽聽聽聽聽return聽randomized_select(data,聽i聽+聽1,聽r,聽k聽-聽count);
49聽}聽
Java浠g爜錛?br />聽1聽package聽algorithm;
聽2聽
聽3聽import聽java.util.ArrayList;
聽4聽import聽java.util.Collections;
聽5聽import聽java.util.List;
聽6聽import聽java.util.Random;
聽7聽
聽8聽public聽class聽FindKth聽{
聽9聽
10聽聽聽聽聽public聽static聽Random聽rand聽=聽new聽Random();
11聽
12聽聽聽聽聽/**
13聽聽聽聽聽聽*聽Find聽the聽K-th聽smallest聽number聽in聽a聽list聽using聽random聽algorithm
14聽聽聽聽聽聽*聽
15聽聽聽聽聽聽*聽@return聽the聽k-th聽smallest聽number
16聽聽聽聽聽聽*/
17聽聽聽聽聽public聽static聽int聽selectKth(int[]聽arr,聽int聽k)聽{
18聽聽聽聽聽聽聽聽聽int聽low聽=聽0;
19聽聽聽聽聽聽聽聽聽int聽high聽=聽arr.length聽-聽1;
20聽聽聽聽聽聽聽聽聽int聽m;
21聽聽聽聽聽聽聽聽聽k聽=聽k聽-聽1;
22聽聽聽聽聽聽聽聽聽while聽(low聽<聽high)聽{
23聽聽聽聽聽聽聽聽聽聽聽聽聽int聽r聽=聽low聽+聽rand.nextInt(high聽-聽low聽+聽1);
24聽聽聽聽聽聽聽聽聽聽聽聽聽swap(arr,聽low,聽r);
25聽聽聽聽聽聽聽聽聽聽聽聽聽m聽=聽low;
26聽聽聽聽聽聽聽聽聽聽聽聽聽for聽(int聽i聽=聽low聽+聽1;聽i聽<=聽high;聽i++)
27聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽if聽(arr[i]聽<聽arr[low])
28聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽swap(arr,聽++m,聽i);
29聽聽聽聽聽聽聽聽聽聽聽聽聽swap(arr,聽low,聽m);
30聽聽聽聽聽聽聽聽聽聽聽聽聽if聽(m聽==聽k)
31聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽return聽arr[k];
32聽聽聽聽聽聽聽聽聽聽聽聽聽else聽if聽(m聽<聽k)
33聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽low聽=聽m聽+聽1;
34聽聽聽聽聽聽聽聽聽聽聽聽聽else
35聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽high聽=聽m聽-聽1;
36聽聽聽聽聽聽聽聽聽}
37聽
38聽聽聽聽聽聽聽聽聽return聽arr[k];
39聽聽聽聽聽}
40聽
41聽聽聽聽聽public聽static聽int聽selectKth(Integer[]聽arr,聽int聽k)聽{
42聽聽聽聽聽聽聽聽聽int[]聽array聽=聽new聽int[arr.length];
43聽聽聽聽聽聽聽聽聽for聽(int聽i聽=聽0;聽i聽<聽arr.length;聽i++)
44聽聽聽聽聽聽聽聽聽聽聽聽聽array[i]聽=聽arr[i];
45聽聽聽聽聽聽聽聽聽return聽selectKth(array,聽k);
46聽聽聽聽聽}
47聽
48聽聽聽聽聽private聽static聽void聽swap(int[]聽arr,聽int聽low,聽int聽r)聽{
49聽聽聽聽聽聽聽聽聽int聽tmp聽=聽arr[low];
50聽聽聽聽聽聽聽聽聽arr[low]聽=聽arr[r];
51聽聽聽聽聽聽聽聽聽arr[r]聽=聽tmp;
52聽聽聽聽聽}
53聽
54聽聽聽聽聽/**
55聽聽聽聽聽聽*聽@param聽args
56聽聽聽聽聽聽*/
57聽聽聽聽聽public聽static聽void聽main(String[]聽args)聽{
58聽聽聽聽聽聽聽聽聽List<Integer>聽list聽=聽new聽ArrayList<Integer>();
59聽聽聽聽聽聽聽聽聽for聽(int聽i聽=聽0;聽i聽<聽10;聽i++)
60聽聽聽聽聽聽聽聽聽聽聽聽聽list.add(new聽Integer(i聽+聽1));
61聽聽聽聽聽聽聽聽聽Integer[]聽arr聽=聽new聽Integer[list.size()];
62聽聽聽聽聽聽聽聽聽for聽(int聽loop聽=聽0;聽loop聽<聽1000;聽loop++)聽{
63聽聽聽聽聽聽聽聽聽聽聽聽聽Collections.shuffle(list);
64聽聽聽聽聽聽聽聽聽聽聽聽聽list.toArray(arr);
65聽聽聽聽聽聽聽聽聽聽聽聽聽int聽res聽=聽selectKth(arr,聽5);
66聽聽聽聽聽聽聽聽聽聽聽聽聽if聽(res聽!=聽5)
67聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽System.out.println(loop聽+聽"聽"聽+聽res);
68聽聽聽聽聽聽聽聽聽}
69聽
70聽聽聽聽聽}
71聽
72聽}
73聽
Python浠g爜錛?br />聽1聽#!/usr/bin/env聽python
聽2聽from聽random聽import聽randint
聽3聽
聽4聽#聽finding聽the聽kth聽smallest聽number聽in聽a聽list
聽5聽def聽select(list,聽k):
聽6聽聽聽聽聽low聽=聽0
聽7聽聽聽聽聽up聽=聽len(list)聽-聽1
聽8聽聽聽聽聽k聽=聽k聽-聽1
聽9聽聽聽聽聽while(low聽<聽up):
10聽聽聽聽聽聽聽聽聽rand聽=聽randint(low,聽up)
11聽聽聽聽聽聽聽聽聽list[low],聽list[rand]聽=聽list[rand],聽list[low]聽#swap
12聽聽聽聽聽聽聽聽聽m聽=聽low
13聽聽聽聽聽聽聽聽聽tmp聽=聽list[low]
14聽聽聽聽聽聽聽聽聽for聽i聽in聽xrange(low聽+聽1,聽up聽+聽1):
15聽聽聽聽聽聽聽聽聽聽聽聽聽if聽list[i]聽<聽tmp:
16聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽m聽+=聽1
17聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽list[m],聽list[i]聽=聽list[i],聽list[m]聽#聽swap
18聽聽聽聽聽聽聽聽聽list[m],聽list[low]聽=聽list[low],聽list[m]
19聽聽聽聽聽聽聽聽聽if聽m聽==聽k:
20聽聽聽聽聽聽聽聽聽聽聽聽聽return聽list[k]
21聽聽聽聽聽聽聽聽聽elif聽m聽<聽k:
22聽聽聽聽聽聽聽聽聽聽聽聽聽low聽=聽m聽+聽1
23聽聽聽聽聽聽聽聽聽elif聽m聽>聽k:
24聽聽聽聽聽聽聽聽聽聽聽聽聽up聽=聽m聽-聽1聽聽
25聽聽聽聽聽return聽list[k]
26聽聽聽聽聽
27聽聽聽聽聽
28聽x聽=聽range(1,聽11)
29聽from聽random聽import聽shuffle
30聽for聽i聽in聽range(100):
31聽聽聽聽聽shuffle(x)
32聽聽聽聽聽print聽select(x,聽5)

]]>