之前整理過乙份學習筆記放到了部落格上,但是演算法是借用了他人的成果,是看了網上多篇文章之後又寫出來的。寫完的時候還遇到一點小問題,最終的糾正方式也是參考網路文章。今天再次整理一下相關的內容,主要是針對自己曾經有一點迷惑的地方進行思考總結。
之前的**:
packagequicksortpack;
public
classquicksortclass
array[low_index] = array[low_index] ^ array[high_index];
array[high_index] = array[low_index] ^ array[high_index];
array[low_index] = array[low_index] ^ array[high_index];
while((array[low_index] <= array[high_index])&&(high_index > low_index))
array[low_index] = array[low_index] ^ array[high_index];
array[high_index] = array[low_index] ^ array[high_index];
array[low_index] = array[low_index] ^ array[high_index];
}array[high_index] = base_value;
/* return the index of base_value */
returnhigh_index;
}public
static
voidsortarray(intarray,intlow_index,inthigh_index)
intbase_value_index = partialize(array,low_index,high_index);
sortarray(array,low_index,base_value_index - 1);
sortarray(array,base_value_index + 1,high_index);
}public
static
voidmain(string args) ;
inti,array_length;
array_length = array_data.length;
/* display raw data */
system.out
.println("data before sorted:");
for(i = 0;i
< array_length;i++)
system.out
.println();
sortarray(array_data,0,array_length - 1);
/* display result data */
system.out
.println("data after sorted:");
for(i = 0;i
< array_length;i++)}}
編譯後的執行結果:
databefore sorted:
1, 5,3, 6, 2, 4, 7, 8, 4, 12, 55, 22, 99, 47, 12, 53,
dataafter sorted:
1, 2, 3, 4, 4, 5, 6, 7, 8, 12, 12, 22, 47,53, 55, 99,
總體的分治思想我清楚了,但是一直沒有弄明白最後為什麼要給array_data[high_index]進行檢查後的賦值。後來自己做了乙個簡單的待排序演示之後一步步看到最後終於明白,道理其實很簡單——最後while迴圈結束的條件應該是low_index和hingh_index重合的時候。而這次重合退出的時候,重合點的資料儲存實際上是乙個未就緒狀態。而這個地方其實應該儲存的是最初用於比較的基準數值。既然兩個index重合,其實這裡對哪乙個進行賦值都能夠達到最終的效果。接下來驗證一下想法,修改**如下:
packagequicksortpack;
public
classquicksortclass
array[low_index] = array[low_index] ^ array[high_index];
array[high_index] = array[low_index] ^ array[high_index];
array[low_index] = array[low_index] ^ array[high_index];
while((array[low_index] <= array[high_index])&&(high_index > low_index))
array[low_index] = array[low_index] ^ array[high_index];
array[high_index] = array[low_index] ^ array[high_index];
array[low_index] = array[low_index] ^ array[high_index];
}array[low_index] = base_value;
/* return the index of base_value */
returnhigh_index;
}public
static
voidsortarray(intarray,intlow_index,inthigh_index)
intbase_value_index = partialize(array,low_index,high_index);
sortarray(array,low_index,base_value_index - 1);
sortarray(array,base_value_index + 1,high_index);
}public
static
voidmain(string args) ;
inti,array_length;
array_length = array_data.length;
/* display raw data */
system.out
.println("data before sorted:");
for(i = 0;i
< array_length;i++)
system.out
.println();
sortarray(array_data,0,array_length - 1);
/* display result data */
system.out
.println("data after sorted:");
for(i = 0;i
< array_length;i++)}}
編譯執行的結果如下:
databefore sorted:
1, 5,3, 6, 2, 4, 7, 8, 4, 12, 55, 22, 99, 47, 12, 53,
dataafter sorted:
1, 2, 3, 4, 4, 5, 6, 7, 8, 12, 12, 22, 47,53, 55, 99,
從上面的結果來看,最終兩個程式的執行結果是一致的。也就是說,最後的賦值並不是因為之前這個數值被修改了需要恢復,而是重合點本身就是一種未就緒的狀態。
排序 快速排序(java實現)
快速排序是一種非常高效的排序演算法,它採用了 分而治之 的思想,把大的拆分成小的,小的再拆分為更小的。其原理如下 對於給定一組記錄,通過一趟排序後,將原序列分為兩部分,其中前一部分的所有記錄都比後一部分的所有記錄小,然後再依次對前後兩部分的記錄進行快速排序,遞迴該過程,直到序列中所有的記錄均為有序為...
快速排序的java實現
快排原理 在要排的數 比如陣列a 中選擇乙個中心值key 比如a 0 通過一趟排序將陣列a分成兩部分,其中以key為中心,key右邊都比key大,key左邊的都key小,然後對這兩部分分別重複這個過程,直到整個有序。整個快排的過程就簡化為了一趟排序的過程,然後遞迴呼叫就行了。一趟排序的方法 1,定義...
快速排序的Java實現
思路 以乙個數為基準數 一般為頭數或者尾數 再定義頭尾兩個游標,頭游標依次往右移並進行判斷是否比基準數小直至遇到比基準數大的數 尾游標依次往左移並進行判斷是否比基準數大直至遇到比基準數小的數。接著將兩個游標所在的數進行swap交換操作。迴圈判斷並進行swap操作,直至left上述1,2完成一次遞迴,...