//採用遞迴的快速排序
public
void
quicksortrecursion(int arr, int len, int start, int end)
int index = partition(arr, len, start, end);
if (index > start)
if (index < end)
}/**
* 以基礎比較位為中心,小的排在左邊,大的排在右邊
*@param arr
*@param start
*@param end
*@param len
*@return 返回已排序元素的下標
*/private
intpartition(int arr, int len, int start, int end)
//以第乙個元素作為被排序的元素,這裡可以隨便指定基線元素位置
int index = start;
int temp = arr[index];
//基線元素首先和第乙個元素交換
arr[index] = arr[index] ^ arr[start];
arr[start] = arr[index] ^ arr[start];
arr[index] = arr[index] ^ arr[start];
while (start < end)
if (start < end)
//2.找到左邊大於基線元素的下標,然後和end做交換
while ((arr[start] < temp) && (start < end))
if (start < end)
}//需要把坑填上,因為坑裡面是原有元素的乙個副本
arr[start] = temp;
return start;
}
private
int partitionexchange(int arr, int len, int start, int end)
//以第乙個元素作為被排序的元素,這裡可以隨便指定基線元素位置
intindex = randominrange(start, end);
//交換式的關鍵在於,一開始就固定基線元素的位置
swap(arr, index, end);
//從左到右開始掃瞄,用來標記第乙個小於基線元素的值
int small = start -1;
for (index = start; index
< end; index++) }}
++small;
swap(arr, small, end);
return small;
}
public
void quicksortnonrecursion(int arr, int len, int start, int end)
if(r > index + 1) }}
}
總結:
一:快速排序的佔坑式比較容易理解,但是結合隨意指定基線元素就需要思考一下,如何處理。比較好的處理辦法是把隨意指定的基線元素和陣列中的頭元素或者尾元素交換,這樣處理就簡單一些。
二:交換式,著重在每次交換兩個元素,而不是每次填坑。把基線元素的位置固定後末尾,從左到右掃瞄,大於基線元素的元素不管,找到第乙個小於基線元素的元素,此時交換第乙個大於基線元素的元素和第乙個小於基線元素的元素。經典,**簡潔。
關於JS的快速排序實現方法
由於自己不是計算機專業,資料結構沒有太多研究,曾經面試時有被問過關於快速排序以及氣泡排序的寫法,氣泡排序比較簡單,當時能回答出來,但是快速排序當時就比較懵逼,不知道是個什麼方式實現的,面試回來後也沒太在意,最近在看c語言的資料結構,拓展下這方面的知識,其中就看到了關於快排演算法的描述 描述如下 在待...
快速排序的兩種實現方式
從小 大排序 以首位元素作為基準元素 在起始位置小於結束位置的前提下,先從右到左迴圈陣列元素,如果大於基準元素,則向左移動結束位置的索引,當不滿足迴圈條件的時候,將索引是高位的元素賦予索引為低位的元素 也就是首位元素所在的地方 然後從左到右迴圈陣列元素,如果小於基準元素,則向右移動開始位置的索引,當...
快速排序的三種實現方式
隨機選取乙個基數 一般是陣列的第乙個 小技巧 可以在陣列中隨機取乙個元素換到首位作為基準元素 進行排序,把小於基數的放到左邊,大於基數的放到右邊 分別對基數的左 右部分重新進行步驟2,直到陣列有序。由上面的步驟可以看出,最重要的是第二步,本文來講解三種方式實現元素分堆。第一種 雙指標 i j 同時從...