三维网格精简算法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版_几种常见算法的精简版-的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux取消中文网,SELinux如何
- 下一篇: 数据结构--队列Queue--打印杨辉三