日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三维网格精简算法java版_几种常见算法的精简版-

發布時間:2024/7/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三维网格精简算法java版_几种常见算法的精简版- 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 packagetest;2

3 importjava.nio.channels.SelectableChannel;4

5 importcom.itqf.bean.User;6

7 public classcTypeCode {8

9 /********************************************希爾排序和插入排序*******推薦嚴慧敏的那本數據結構,思想步驟我都加入到算法里面了,很精簡了***********************************************************10 * 插入排序11 *12 *@paramvalues13 * 帶排序數組14 */

15 public void insertSort(int[] values) {16 int mod;//中間值

17 for (int i = 1; i < values.length; i++) {18 mod = values[i];//記錄初始位置的值,完成交換

19 int index = 0;//記錄位置

20 for (int j = i; j >= 1; j--) {21 //如果前面的值比后面的值小,就后 移

22 if (values[j - 1] >mod) {23 values[j] = values[j - 1];24 } else{25 index =j;26 break;27 }28 }29 values[index] =mod;30 }31

32 }33

34 /**

35 * shell sort36 * 希爾排序是對插入排序的一個改進,相隔幾個增量的遞進式排序,直到增量為1。。所有的增量必須只能被1除。37 *@paramvalues38 * valuies which wait for sroted39 *@paramdk40 * added values41 */

42 public void shellSort(int[] values, intdk) {43 if (dk >values.length) {44 System.out.println("values is beyond the binder");45 return;46 }47 //* 1.使用增量循環遍歷數組

48 for (int i = dk; i < values.length; i++) {49 //* 2.創建保留初始比較值得變量,創建保存比較值的下標值的變量

50 int mod =values[dk];51 int index = 0;52 //* 3.遍歷后面已經排好序的序列,退出循環

53 for (int j = i; j >= dk; j -=dk) {54 //在合適的地方插入比較值,如果比較值小于當前值,就交換,

55 if (values[j - dk] >mod) {56 values[j] = values[j -dk];57 } else{58 //否則,記下比較值的下標,進行交換,

59 index =j;60 break;61 }62 }63 //4.在下標處填入初始比較值,第一輪比較完成

64 values[index] =mod;65 }66 }67

68 /********************快速排序分割線***********************************************************************************69 * 快速排序方法 為什么會采用這種歸位那,因為始終是在和樞軸進行比較,就沒有必要進行樞軸的交換了。70 *71 *@paramvalues72 * 待排序數組73 *@paramlow74 * 最低位下標75 *@paramhigh76 * 最高位下標77 */

78 public static int quickSort(int[] values, int low, inthigh) {79 //1.確定樞軸,以第一個為樞軸80 //1.1 為了提高性能,采用三者取中方法,可大大提高亂序情況下的性能

81 intpivotKey;82 int[] keys = { values[low], values[high], values[(low + high) / 2] };83 pivotKey = keys[0];84 for (int i = 0; i < keys.length - 1; i++) {85 if (pivotKey

90 while (low

92 while (low < high && values[high] >=pivotKey)93 --high;94 //2.2 把高位賦值給低位

95 values[low] =values[high];96 //3.從最低位開始依次遞增檢查大于樞軸的關鍵字,和high交換

97 while (low < high && values[low] <=pivotKey)98 ++low;99 //把低位賦值給高位

100 values[high] =values[low];101 //4.重復2和3步驟

102 }103 //5.樞軸歸位

104 values[low] =pivotKey;105 //6.返回樞紐位置

106 returnlow;107

108 }109

110 /**

111 * 快速排序完整部分112 *113 *@paramvalues114 *@paramlow115 *@paramhigh116 */

117 public static void overrallSort(int[] values, int low, inthigh) {118 if (low

121 overrallSort(values, low, index - 1);122 //樞軸右半部排序

123 overrallSort(values, index + 1, high);124 }125 }126

127 /**

128 * 選擇排序129 *130 *@paramvalues131 */

132 public static void selectSort(int[] values) {133 for (int i = 0; i < values.length - 1; i++) {134 for (int j = i; j < values.length; j++) {135 if (values[i] >values[j]) {136 //交換關鍵字

137 int mad =values[i];138 values[i] =values[j];139 values[j] =mad;140 }141 }142 }143

144 }145

146 /****************************************************大頂堆排序算法************************************147 * 堆排序148 *@parama149 *@paramb150 *@return

151 */

152 public boolean isBig(int a, intb) {153 if (a

159 /**

160 * 此部分算法,視為最簡潔堆排序算法。比網上大部分都要好,但是難理解,把這個算法理解了,你會發現很簡潔的算法。161 *@paramvalues162 *@paramstart163 *@paramhigh164 */

165 public void heapAdjust(int[] values, int start, inthigh) {166 int rc =values[start];167 for (int i = 2 * start; i <= high; i *= 2) {//沿著key較大的孩子節點向下篩選

168 if (i < high && !isBig(values[i], values[i + 1])) {//i為較大的記錄的下標

169 i++;//如果i是小的記錄,就把i加一,變為沿著另一個子節點向下跑

170 }171 if (isBig(rc, values[i])) {//如果rc大于最大的子節點,就把rc插入到start的位置,也就是父節點,然后這一部分的堆排序結束

172 break;//rc應該插入到s位置上

173 }174 values[start] = values[i];//rc不大于最大的子節點,就把最大的子節點放到父節點的位置,進行下一次循環堆排序

175 start = i;//沿著key值最大的節點向下篩選

176 }177 values[start] = rc;//插入,也可以理解為歸位

178 }179

180 public void heapSort(int[] values) {181 /**

182 * 堆排序要解決兩個問題。 第一,如何由無序序列建成一個堆 第二,如何在輸出堆頂元素之后,調整剩余元素成為一個新的堆 現在建立大根堆183 */

184 for (int i = (values.length - 1) / 2; i >= 0; i--) {185 heapAdjust(values, i, values.length - 1);186 }187 for (int i = values.length - 1; i > 0; i--) {188 //交換堆頂最大值和最后一個記錄

189 int mad = values[0];190 values[0] =values[i];191 values[i] =mad;192 heapAdjust(values, 0, i - 1);193 }194 }195

196 /***********************************************************************歸并排序算法分割線*********************************************197 * 歸并部分排序算法198 *199 *@paramvalues200 *@paramlow201 *@parammad202 *@paramhigh203 */

204 public static void merge(int[] values, int low, int mad, inthigh) {205 int[] tr = new int[high + 1];//輔助序列

206 int low1 =low;207 int high1 =high;208 inti;209 int j = mad + 1;210 //* 第一步:循環整個序列,分為兩部分進行比較,數值大的加入到輔助序列中,重復此步驟

211 for (i = low; low <= mad && j <= high; i++) {212 if (values[low] >values[j]) {213 tr[i] = values[low++];214 } else{215 tr[i] = values[j++];216 }217 }218 //* 第二步,把還有剩余的部分加入到輔助序列中

219 if (j <=high) {220 tr[i] = values[j++];221 }222 if (low <=mad) {223 tr[i] = values[low++];224 }225 //* 第三步:把輔助序列中排好序的序列恢復到原先的存儲中226 //把排序好的序列恢復到原序列中

227 for (int j2 = low1; j2 <= high1; j2++) {228 values[j2] =tr[j2];229 }230

231 }232

233 /**

234 * 歸并排序235 *@paramvalues236 *@paramlow237 *@paramhigh238 */

239 public static void mSort(int[] values, int low, inthigh) {240 if (low == high) {//如果相等,就返回

241 return;242 } else{243 int mad = (low + high) / 2;244 mSort(values, low, mad);245 mSort(values, mad + 1, high);246 merge(values, low, mad, high);247 }248 }249

250

251 /**************************************************************************************簡單哈希算法分割線*************************************************252 * 在hash表中查找指定值253 * 首先看一下,用hash函數得出來的hash地址位置上是否有值并且和要查找的值相等,如果相等,就返回,如果不相等,就繼續查找下一個。、254 * 不為空和不相等,同時成立,才會有找下去的必要,其他情況沒有必要找下去。比如,位置為空,就可以直接退出了。255 *256 *@paramhashTable257 *@paramvalue258 */

259 public boolean searchHash(int[] hashTable, intvalue) {260 //計算hash值

261 int hashCode =getHashCode(value, hashTable.length);262 //檢測用hash函數得出來的hash地址位置上是否有值并且和要查找的值相等,兩者都不想等,繼續查找。找到退出循環263 //不為空和不相等,同時成立,才會有找下去的必要,其他情況沒有必要找下去。比如,位置為空,就可以直接退出了。

264 while (hashTable[hashCode] != 0 && hashTable[hashCode] !=value) {265 hashCode++;266 }267 //找到就返回成功

268 if (hashTable[hashCode] ==value) {269 return true;270 }271 return false;272

273 }274

275 /**

276 * 計算hash值277 *278 *@paramvalue279 * 關鍵字280 *@paramlength281 * hash表長度282 *@return

283 */

284 public int getHashCode(int value, inthashLength) {285

286 return value %hashLength;287

288 }289

290 public static voidmain(String[] args) {291

292 //TODO Auto-generated method stub

293

294 int[] values = { 12, 8, 2, 3, 4, 78, 96, 52};295 //

296 // //overrallSort(values, 0, values.length-1);297 // //int index = quickSort(values, 0, values.length-1);298 //selectSort(values);299 //System.out.println(index);300

301

302 //user.heapSort(values);堆排序

303 mSort(values, 0, values.length - 1);//歸并排序 這個歸并排序有點問題,最后一個為什么是0,我看不出來,有看出來的,請回答,謝謝。

304 for (int i = 0; i < values.length; i++) {305 System.out.print(values[i] + " ");306 }307 }308 }

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的三维网格精简算法java版_几种常见算法的精简版-的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。