資料庫實現原理#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個元素的方法陣列
- jQuery在元素集合中獲取第N個元素jQuery
- jquery獲取指定li元素後面的第n個li元素jQuery
- 獲取不同資料庫新增記錄主鍵值資料庫
- C#獲取檔案MD5值方法C#
- css 獲取從第n個開始,之後的所有元素CSS
- yii2 從資料庫獲取內容值型別與資料庫欄位型別問題解決資料庫型別
- 資料庫實現原理#4(Hash Join)資料庫
- Thinkphp5框架實現獲取資料庫資料到檢視的方法PHP框架資料庫
- Struts2筆記10 向值棧放入或獲取資料筆記
- 原生js實現獲取form表單資料JSORM
- 利用javascript獲取圖片的top N主色值JavaScript
- 資料庫實現原理#1(Nested Loop Join)資料庫OOP
- 獲得JD商品評論 API 如何實現實時資料獲取API
- jdbc獲取資料庫連線JDBC資料庫
- 2條流程解決資料同步到全球部署的N個資料庫資料庫
- 獲取oracle資料庫連線出現的問題Oracle資料庫
- java連線Oracle資料庫獲取資料JavaOracle資料庫
- MySQL分組查詢後獲取前N條資料MySql
- 資料庫實現原理#6(共享記憶體)資料庫記憶體
- 資料庫連線池的實現及原理資料庫
- 資料庫分散式事務的實現原理!資料庫分散式
- 一SQL,每隔n個資料,取其中max,min值SQL
- mORMot2 獲取資料集1ORM
- 獲取資料庫bak檔案資訊資料庫
- 機器學習 第2篇:資料預處理(缺失值)機器學習
- redis叢集資料儲存和獲取原理Redis
- 淘寶/天貓獲得淘寶商品詳情 API 如何實現實時資料獲取?API
- django使用多個資料庫實現Django資料庫
- ajax實現定時從伺服器獲取資料伺服器
- Zepto中資料快取原理與實現快取
- 使用SQL語句從資料庫一個表中隨機獲取資料SQL資料庫隨機
- es6實現獲取陣列中最大值陣列
- JDBC 獲取被插入資料的主鍵ID值JDBC
- 《redis設計與實現》2-資料庫實現篇Redis資料庫