基于Hash表的排序--C語言

我們知道,C語言里面是沒有hash表的,但是我們可以用一個結構體表示,對結構體排序,我們可以用qsort排序。
下面我們用一個LeedCode上面的一道題目講解。
347. 前 K 個高頻元素
這個題目是讓我們求解前k個高頻元素,求解思路如下:我們構建一個Hash表,Hash表用一個結構體表示,該結構體存放元素值和元素的個數,我們先把數組里面的值存放到Hash表里面,然后我們對該Hash表按照元素個數進行進行排序,這樣就可以找到前k個高頻元素了。

1 定義Hash表

#define Hash_SIZE 20001
#define OFFSET 10000 typedef struct {int val;			//存放值int cnt;			//cnt存儲出現次數
}HashTable;
HashTable hash[Hash_SIZE];

hash就是我們要的Hash表。

2 將數組值存放到Hash表中

for (i = 0; i < numsSize; i++) {     		   //將值和出現的次數放入hash表中hash[(nums[i] + OFFSET) % Hash_SIZE].cnt++;   //偏移使下標>=0hash[(nums[i] + OFFSET) % Hash_SIZE].val = nums[i];}for (i = 0; i < Hash_SIZE; i++) {   		  //對原hash表進行優化,從開始存儲if (hash[i].cnt != 0) {hash[j].cnt = hash[i].cnt;hash[j].val = hash[i].val;j++;}}

3 對Hash表按照元素個數進行排序

int comp(const void* a, const void* b) {	//cnt大到小return (((HashTable*)b)->cnt - ((HashTable*)a)->cnt);
}qsort(hash, j, sizeof(HashTable), comp);

全部代碼:

#define Hash_SIZE 20001
#define OFFSET 10000 typedef struct {int val;int cnt;			//cnt存儲出現次數
}HashTable;
HashTable hash[Hash_SIZE];int comp(const void* a, const void* b) {	//cnt大到小return (((HashTable*)b)->cnt - ((HashTable*)a)->cnt);
}int* topKFrequent(int* nums, int numsSize, int k, int* returnSize) {memset(hash, 0, sizeof(hash));   			//初始化0int i, j = 0;for (i = 0; i < numsSize; i++) {     		   //將值和出現的次數放入hash表中hash[(nums[i] + OFFSET) % Hash_SIZE].cnt++;   //偏移使下標>=0hash[(nums[i] + OFFSET) % Hash_SIZE].val = nums[i];}for (i = 0; i < Hash_SIZE; i++) {   		  //對原hash表進行優化,從開始存儲if (hash[i].cnt != 0) {hash[j].cnt = hash[i].cnt;hash[j].val = hash[i].val;j++;}}qsort(hash, j, sizeof(HashTable), comp);for (i = 0; i < k; i++)	nums[i] = hash[i].val;	//輸出前k個高頻元素*returnSize = k;return nums;
}

其他

為什么OFFSET是10000,Hash_Size是20001,我看別人的解釋是這個題目數的范圍是-10000到+10000。超過這個范圍會報錯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379646.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ORACLE10g R2及PATH官方下載地址

ORACLE10g R2及PATH官方下載地址 Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit)http://download.oracle.com/otn/nt/oracle10g/10201/10201_database_win32.zip http://download.oracle.com/otn/nt/oracle10g/102…

[網摘]Javascript中最常用的55個經典技巧

1. οncοntextmenu"window.event.returnValuefalse" 將徹底屏蔽鼠標右鍵<table border οncοntextmenureturn(false)><td>no</table> 可用于Table 2. <body onselectstart"return false"> 取消選取、防止復制 3. οnpaste"…

Java集合unmodifiableMap()方法及示例

集合類unmodifiableMap()方法 (Collections Class unmodifiableMap() method) unmodifiableMap() method is available in java.util package. unmodifiableMap()方法在java.util包中可用。 unmodifiableMap() method is used to get a non-modifiable view of the given Map (…

Linux內核設計與實現---內核同步方法

內核同步方法1 原子操作原子整數操作原子性與順序性的比較原子位操作2 自旋鎖自旋鎖是不可遞歸的其他針對自旋鎖的操作自旋鎖和下半部3 讀-寫自旋鎖4 信號量創建和初始化信號量使用信號量5 讀-寫信號量6 自旋鎖和信號量7 完成變量8 互斥鎖互斥鎖API9 禁止搶占10 順序和屏障1 原…

單擊瀏覽器右上角的X彈出提示窗口

單擊瀏覽器右上角的X彈出提示窗口&#xff0c;簡單實現。 <script language"javascript">window.onunload function () { if (event.clientY < 0 && event.clientX> document.body.scrollWidth) { //event.returnValue …

Java DataOutputStream writeChars()方法及示例

DataOutputStream類writeChars()方法 (DataOutputStream Class writeChars() method) writeChars() method is available in java.io package. writeChars()方法在java.io包中可用。 writeChars() method is used to write the given string as a sequence of characters to th…

對c#拆裝箱的性能分析(泛型)

c#中&#xff0c;數據類型主要分為2種&#xff0c;分別為值類型和引用類型。把值類型轉換為引用類型稱為裝箱&#xff0c;把引用類型轉換為值類型稱為拆箱。在c#中&#xff0c;值類型是在堆棧上分配內存的&#xff0c;而引用類型是在堆上分配內存的。裝箱的時候&#xff0c;CLR…

UNIX環境高級編程---進程間通信總結

進程間通信1 管道匿名管道命名管道2 消息隊列3 信號量POSIX信號量有名信號量無名信號量有名信號量和無名信號量的公共操作4 共享內存5 信號相關函數6 套接字針對 TCP 協議通信的 socket 編程模型針對 UDP 協議通信的 socket 編程模型針對本地進程間通信的 socket 編程模型總結L…

C語言一個小小的問題引起的對指針的探究。。。

C語言一個小小的問題引起的對指針的探究。。。 廢話不多說。下面是這個大家認識的一個及其簡單的程序&#xff1a; 1 #include <stdio.h>2 void A(int a[])3 {4 printf("%d/t", sizeof(a));5 }6 int main()7 {8 int a[512];9 int *p; 10 …

java 方法 示例_Java集合syncedSet()方法與示例

java 方法 示例集合類syncedSet()方法 (Collections Class synchronizedSet() method) synchronizedSet() method is available in java.util package. 可以在java.util包中使用syncedSet ()方法 。 synchronizedSet() method is used to return the synchronized view of the …

IE的全屏幕顯示(javascript)

<SCRIPT LANGUAGE"javascript"> <!-- if (this.name!fullscreen){ window.open(location.href,fullscreen,fullscreen,scrollbars) } // --> </script> 轉載于:https://www.cnblogs.com/bangchao/archive/2009/06/26/1511645.html

搜索---廣度優先遍歷、深度優先遍歷、回溯法

參考文章&#xff1a;https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E6%90%9C%E7%B4%A2.md 廣度優先搜索&#xff08;BFS&#xff09; 廣度優先搜索是按層來處理頂點的&#xff0c;距離開始點最近的那些頂點首先被訪問&#…

如何更改Visual Studio 2008中類文件引用的默認名稱空間?

在編寫程序的時候&#xff0c;如果某些名稱空間經常用到&#xff0c;每次創建一個文件的時候&#xff0c;都需要手工添加名稱空間&#xff0c;是不是很煩人呢&#xff1f;多說人會回答&#xff1a;是的。如果新建文件的時候就自動加上自己需要的名稱空間該多好啊。&#xff1a;…

Java ClassLoader findLoadedClass()方法與示例

ClassLoader類findLoadedClass()方法 (ClassLoader Class findLoadedClass() method) findLoadedClass() method is available in java.lang package. findLoadedClass()方法在java.lang包中可用。 findLoadedClass() method is used to return the Class with the given binar…

Linux內核設計與實現---內存管理

內存管理1 頁2 區3 獲得頁獲得填充為0的頁釋放頁4 kmalloc()gfp_mask標志kfree()5 vmalloc()6 slab層slab層的設計7 slab分配器的接口8 在棧上的靜態分配9 高端內核的映射永久映射臨時映射10 每個CPU的分配11 新的每個CPU的接口編譯時的每個CPU數據運行時每個CPU數據12 使用每個…

多語言開發 之 通過基頁類及Session 動態響應用戶對語言的選擇

在用戶通過UserLogin.aspx登錄系統時 提供其對語言的選擇選擇后 將所選存入Session 以便登錄系統后的其他頁面進行按語言顯示當然相關頁面需要支持多語言具體信息可參看使用 根據語言環境不同 而顯示不同的 資源本地化 ASP.NET 網頁 App_Code下定義基頁類 BasePage.cs Codeusin…

Java ClassLoader findSystemClass()方法與示例

ClassLoader類findSystemClass()方法 (ClassLoader Class findSystemClass() method) findSystemClass() method is available in java.lang package. findSystemClass()方法在java.lang包中可用。 findSystemClass() method is used to find the class with the given binary …

TFS 鏈接不上

C:\Users\Administrator>net use 會記錄新的網絡連接。 列表是空的。 C:\Users\Administrator>net use \\192.168.1.61\ipc$ wangkun /user:wangkun 命令成功完成。 轉載于:https://www.cnblogs.com/rhythmK/archive/2012/06/04/2534066.html

Linux內核設計與實現---虛擬文件系統

虛擬文件系統1 通用文件系統2 文件系統抽象層3 Unix文件系統4 VFS對象及其數據結構其他VFS對象5 超級快對象超級塊操作6 索引節點對象索引節點操作7 目錄項對象目錄項狀態目錄項緩存目錄項操作8 文件對象9 和文件系統相關的數據結構10 和進程相關的數據結構11 Linux中的文件系統…

Oracle 查詢歷史數據(轉帖)

回復誤刪除數據信息。 1、執行 alter table table_name enable row movement; 2、執行 FlashBack table table_name to timestamp to_timestamp(2012-05-24 14:59:36,yyyy-mm-dd hh24:mi:ss); 查詢歷史操作數據信息。 比較合理的方法是先從閃回區查找出被誤刪的數據&#xff0c…