小白學演算法3 2 高位優先字串排序

2021-07-10 06:05:09 字數 2349 閱讀 4921

標籤: 小白學演算法

本節內容總結自《演算法(第4版)》5.1節

字串常見的排序演算法有兩種,分別是低位優先(lsd)和高位優先(msd),低位優先從右向左檢查字元,高位優先從左向右檢查字元。低位優先字串排序要求待排序的字串長度一致,然而很多時候字串長度並不一致,低位優先排序並不適用,此時就要用到高位優先排序或者三向字串快排。

高位優先排序遞迴進行,r表示字串的基數(字串中不同字元的數量)。高位優先排序將字元從左向右按照字元分區間進行排序,如待排序的字串為:

c

a b

abc

ab

第一次遞迴按照最左邊字元排序,結果為:

a

abc

ab b

c

然後在以a,b,c開始的字串中,分別按照第二位排序,直到排序完畢。

注意:鍵索引計數一共有4個步驟,計算頻率->將頻率轉換為索引->資料分類->回寫。其中計算頻率需要用到輔助陣列int count,在低位優先排序中,這個陣列的大小為r+1,加1是為了索引方便,而在高位優先中,還需要再加1,即int count的大小為r+2。再加1是當字串達到末尾時,返回索引為-1,而陣列的下標從0開始,故加1才能使用int count陣列計數。此時,count[0]表示已達到末尾的字串數目,count[1]表示字母表中第1個字元的數目……

#include "stdafx.h"

#include

#include

#include

#include

const

int r = 256;

const

int m = 15;

using

namespace

std;

int charat(const

string& str, int d)

//引數分別表示字串容器,排序字串起始位置,排序字串結束位置,鍵的位數,輔助儲存容器

void msd_sort(vector

& svec, int lo, int hi, int d, vector

& aux)

; //計算頻率

for (int i=lo; i<=hi; i++)

count[charat(svec[i], d) + 2]++;//加2

//頻率轉化為索引

for (int r=0; r1; r++)

count[r+1] += count[r];

//分類

for (i=lo; i<=hi; i++)

aux[count[charat(svec[i], d) + 1]++] = svec[i];//乙個加1隱藏在直接索引中

//回寫

for (i=lo; i<=hi; i++)

svec[i] = aux[i-lo];//注意aux下標

//以從左到右的每個字元為鍵進行排序

for (r=0; r//count[r+1]為0,不對應任何字元

msd_sort(svec, lo+count[r], lo+count[r+1]-1, d+1, aux);

}int main(int argc, char* argv)

測數資料如下:

she

sells

seashells

by the

seashore

the

shells

she

sells

are

surely

seashells

執行結果如下:

在數值排序中提到過一次優化排序效率的方法:當待排序陣列的長度較小時,使用插入排序。同樣的,該方法也適應與高位優先字串排序,而且這種優化一般情況下也是必須的,有專家做過實驗,在資料量巨大時,將長度小於10的子陣列排序切換到插入排序,可以將排序的效率提公升十倍左右。

針對字串的插入排序和數值的插入排序思想一模一樣,具體**如下:

void insertion_sort(vector

& svec, int lo, int hi, int d)

}

DES加密字串演算法(32位)

public class desecret 需要知道伺服器那邊註冊資訊時對使用者名稱和密碼的要求。param encryptstring 需要加密的明文 明文的長度必須為 8的倍數。param encryptkey 秘鑰 return 加密後的密文 throws exception public s...

小白學C語言之字元函式與字串函式的實現(一)

本章是網際網路公司裡筆試最愛考的問題之一。主要的函式有 字串長度函式 strlen 長度不受限制的字串函式 strcpy strcat strcmp 長度受限制的字串函式 strncpy strncat strncmp 字串查詢 strstr strtok 錯誤資訊報告 strerror 字元操作 ...

資料結構與演算法(32) 字串演算法

檢查字串p是否是字串t的子串。因為要檢查整個定長的字串p,所以有時候這些演算法稱為精確字串匹配演算法。為了便於討論,假設給定的字串t長度為n,要匹配的字串p的長度為m 方法一 蠻力法 思路 檢查text中每乙個可能位置,檢查pattern是否匹配。由於text的長度為n,所以有n m 1個可選的位置...