資料庫實現原理#2(獲取第N個值).md
獲取陣列中的第N個值,仍使用程式碼說明,演算法參考快速排序的思想,詳見程式碼註釋.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../pub/pub.h"
//tmparr : 待處理的陣列
//counter : 陣列元素個數
//n : 從小到大排列,第n個數字(從0開始計數)
static int quicksort_nth_recursion(int tmparr[],int counter,int n)
{
//DEBUG : 陣列資訊
//print_array(tmparr,counter);
//任意取一個值,找到該值的位置
int pos = 0;
int randompos = rand() % counter;
//把選定的值移到第一個位置
swap(tmparr,0,randompos);
for(int i=1;i < counter;i++)
{
//從1開始遍歷,如遍歷的元素小於選定的值,則把pos加一併吧該值移到pos所在的位置
//迴圈完成後,小於隨機選擇值的數會在pos的左邊,大於等於選擇值的在pos的右邊
if(tmparr[i] < tmparr[0])
{
//如果遍歷
swap(tmparr,++pos,i);
}
}
//printf("value = %d,counter = %d,target = %d,pos = %d\n",tmparr[0],counter,n,pos);
//把選定的值移到它該在的地方
swap(tmparr,pos,0);
if(pos == n)
return tmparr[pos];
//遞迴處理
if(pos < n)//在右邊的陣列中
quicksort_nth_recursion(tmparr+(pos+1),counter-(pos+1),n-(pos+1));
else//在左邊的陣列中
quicksort_nth_recursion(tmparr,pos,n);
}
void main(void)
{
//引數:第1個/中間/最後一個
int pos[3] = {1,0,0};
int result = 0,counter = 0;
int arr[] = {4,10,25,100,53,103,50,40,77,9,5,1,65,19,60,51,500};
counter = sizeof(arr)/sizeof(int);
pos[1] = (counter+1)/2;//中位數
pos[2] = counter;//最大值
for(int i = 0;i < 3;i++)
{
result = quicksort_nth_recursion(arr,counter,pos[i]-1);
printf("---------- The No.%d result is %d ----------\n",pos[i],result);
}
printf("------------------------------------------------------------\n");
int arr2[1<<16];
srand(38838);
for(int i=0;i < 1<<16;i++)
{
arr2[i] = rand();
}
counter = sizeof(arr2)/sizeof(int);
pos[1] = (counter+1)/2;
pos[2] = counter;
for(int i = 0;i < 3;i++)
{
result = quicksort_nth_recursion(arr2,counter,pos[i]-1);
printf("---------- The No.%d result is %d ----------\n",pos[i],result);
}
}
執行輸出
helloworld@DESKTOP-BRAEUTR /d/yunpan/Work/Z-SRC/sort
$ /d/tmp/test.exe
---------- The No.1 result is 1 ----------
---------- The No.9 result is 50 ----------
---------- The No.17 result is 500 ----------
------------------------------------------------------------
---------- The No.1 result is 0 ----------
---------- The No.32768 result is 16541 ----------
---------- The No.65536 result is 32767 ----------
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2684250/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫實現原理#3(Merge Join).md資料庫
- JavaScript 獲取第n個li元素JavaScript
- 獲取md5加密值加密
- 獲取陣列第N個元素的方法陣列
- css 獲取從第n個開始,之後的所有元素CSS
- yii2 從資料庫獲取內容值型別與資料庫欄位型別問題解決資料庫型別
- Thinkphp5框架實現獲取資料庫資料到檢視的方法PHP框架資料庫
- 資料庫實現原理#4(Hash Join)資料庫
- 資料庫實現原理#1(Nested Loop Join)資料庫OOP
- 2條流程解決資料同步到全球部署的N個資料庫資料庫
- 獲得JD商品評論 API 如何實現實時資料獲取API
- MySQL分組查詢後獲取前N條資料MySql
- 資料庫連線池的實現及原理資料庫
- 資料庫分散式事務的實現原理!資料庫分散式
- 資料庫實現原理#6(共享記憶體)資料庫記憶體
- [LeeCode 資料庫刷題] 177. 第 N 高的薪水資料庫
- 【LeeCode 資料庫刷題】177. 第 N 高的薪水資料庫
- mORMot2 獲取資料集1ORM
- SpringBoot2 基礎案例(08):整合Redis資料庫,實現快取管理Spring BootRedis資料庫快取
- Jupyter Notebook實現從IB介面歷史資料獲取,寫入資料庫,策略回測和實盤交易資料庫
- django使用多個資料庫實現Django資料庫
- redis叢集資料儲存和獲取原理Redis
- 《redis設計與實現》2-資料庫實現篇Redis資料庫
- Golang使用geoip2資料庫獲取ip城市與運營商Golang資料庫
- Python實用技法第2篇:使用deque保留最新的N個元素Python
- 實用小工具——快速獲取資料庫時間寫法資料庫
- 達夢資料庫獲取SQL真實的執行計劃資料庫SQL
- 【Python使用】嘿馬頭條完整開發md筆記第2篇:資料庫,作用【附程式碼文件】Python筆記資料庫
- Android使用Camera2獲取預覽資料Android
- mybatis怎麼實現insert into多個資料-oracle資料庫MyBatisOracle資料庫
- 太原面經分享:如何用js實現返回斐波那契數列的第n個值的函式JS函式
- R:連結KEGG資料庫獲取更多描述資訊資料庫
- jsonp跨域獲取資料實現百度搜尋JSON跨域
- 如何實現公平公正的資料獲取及服務生態?
- 構建資料庫雲管平臺 實現資料價值最大化資料庫
- 淘寶/天貓獲得淘寶商品詳情 API 如何實現實時資料獲取?API
- 使用requests庫獲取這個URL
- PHP獲取陣列最後一個值PHP陣列