日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > 【基礎(chǔ)算法】排序-復(fù)雜排序之二(找出第K大的數(shù))

【基礎(chǔ)算法】排序-復(fù)雜排序之二(找出第K大的數(shù))

來源:程序員人生   發(fā)布時(shí)間:2014-11-05 08:54:57 閱讀次數(shù):2710次

分割的思想是快速排序最精華的地方。每次分割出來的元素K1個排在第K位,所以利用這類思想我們最少知道3點(diǎn)

1. 被分割出來的元素K最后1定排在第K位。

2. 在K左側(cè)的元素1定比K小或相等。

3. 在K右側(cè)的元素1定比K大或相等。

所以我們可以通過這些性質(zhì)定位到任意1個元素。

比如我們partition完1個數(shù)組后,得到A={5,3,4,2,6,8,10,12,11,9}

A[K]=8,所以我們知道排好序后的A[5]=8, A[4]1定在8左側(cè),A[6]1定在8右側(cè)

所以,我們1定知道8這個數(shù)是數(shù)組里第5+1小的數(shù),第10⑸大的數(shù)

所以我們得出 如果分割出來的數(shù)A[K]=X, 那末X1定是數(shù)組里的第K+1位,也就是第K+1小的數(shù)

如果數(shù)組的長度為N,那末X就是數(shù)組里第N-K大的數(shù)

下面是分割的代碼

public static int partition(int[] array, int left, int right) { int i = left; int j = right + 1; while (true) { while (more(array[left], array[++i])) if (i == right) break; while (more(array[--j], array[left])) if (j == left) break; if (i >= j) break; exchange(array, i, j); } exchange(array, left, j); return j; }

接下來就是如何在分割后定位其他的元素了?

如果我們定位了A[K]=X,發(fā)現(xiàn)目標(biāo)元素O比X大,那末就在右側(cè)找,left=K+1,如果比X小,那末就在左側(cè)找,right=K⑴,否則定位成功

public static int select(int[] array, int k) { int left = 0; int right = array.length - 1; while (left < right) { int j = partition(array, left, right); if (j < k) left = j + 1; else if (j > k) right = j - 1; else return array[k]; } return array[k]; }

下面給出完全代碼,僅供大家參考

// compare public static boolean more(int v, int w) { return v > w; } // exchange public static void exchange(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } public static int partition(int[] array, int left, int right) { int i = left; int j = right + 1; while (true) { while (more(array[left], array[++i])) if (i == right) break; while (more(array[--j], array[left])) if (j == left) break; if (i >= j) break; exchange(array, i, j); } exchange(array, left, j); return j; } public static int select(int[] array, int k) { int left = 0; int right = array.length - 1; while (left < right) { int j = partition(array, left, right); if (j < k) left = j + 1; else if (j > k) right = j - 1; else return array[k]; } return array[k]; }



生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 精品国产91亚洲一区二区三区www | 在线污视频 | 99久久精品毛片免费播放高清 | 国产精品久久久久婷婷二区次 | 免费成人一级片 | 91亚洲成人 | 美女网站视频在线观看 | 99一区二区三区 | 国产精品久久久久久久午夜片 | 久久久亚洲 | 久久久久久av| 成年人视频网站 | 国产专区一区二区 | 一区二区电影 | 国产精品一区二区在线 | 国产伦精品一区二区三区 | 黄色小视频免费观看 | 国产一区二区三区的电影 | 激情av网站| 青青久在线视频 | 日韩精品视频免费在线观看 | 99视频一区 | 欧美日一区 | 日本美女久久 | 日韩免费视频一区二区 | 精品一性一色一乱农村 | 成人久久久精品乱码一区二区三区 | 国产成人a亚洲精品 | 97人人超碰 | 国产精品视频大全 | 精品亚洲一区二区三区 | 二区av | 久久久www成人免费无遮挡大片 | 欧美国产精品一区二区三区 | 黄色网址进入 | 日韩欧美一区二区在线 | 福利视频网| 日韩视频欧美视频 | 久久久高清 | 亚州精品中文 | 精品国产31久久久久久 |