快速排序思想:以公升序為例;在要排序的序列中選乙個基準,使它左邊的數都比它小,右邊的數都比它大。具體步驟:1、區間選乙個key,可以選區間右邊界的那個數;2、讓begin從區間左邊界開始往後找大於key的數,找到後停下來,再讓end從區間右邊界-1開始往前找小於key的數,找到後讓它和begin找的大的數交換;3、begin繼續找大的,end繼續找小的,如果begin和end相遇了,那麼比較相遇點的數和key的大小,若大於key,就讓相遇點的數和key交換,返回相遇點,否則返回區間右邊界。
while (begin < end && array[end] >= key)//找到小的
swap(array[begin], array[end]);
}//相遇且相遇點的值大於key
if (array[begin]>key)
//相遇但相遇點的值小於key
else
}void sectionsort(int *array,int left, int right)
}void quicksort(int *array, size_t size)
優化:三數取中,保證每次的key值不是最大的或最小的
int getmiddleindex(int *array,int left, int right)
else
else
}}int partsort(int *array, int left, int right)
while (begin < end && array[end] >= key)//找到小的
swap(array[begin], array[end]);
}//相遇且相遇點的值大於key
if (array[begin]>key)
//相遇但相遇點的值小於key
else
} void sectionsort(int *array, int left, int right)
else
}}void quicksort(int *array, size_t size)
快速排序非遞迴:
用棧來儲存區間,劃分區間相當於一棵二叉樹,第一次整個區間排序,那麼把整個區間看做二叉樹的根節點,key值會劃分出左右區間,相當於左右子樹,將左右區間壓棧,迴圈取棧頂區間排序,並把新分出來的區間壓棧,直到棧為空,迴圈結束,全部區間都已排好序。整個過程可以看做二叉樹的深度遍歷。
}//每次的區間範圍壓棧,取棧頂區間partsort,並繼續劃分區間壓棧,相當於深度擴充套件樹節點
void quicksort2(int *array, size_t size)
if (right>mid + 1)
}while (!s.empty())
if (right>mid + 1)}}
快速排序 遞迴與非遞迴
1.以中間值作為基準數 void quick sort int q,int l,int r quick sort q,l,j quick sort q,j 1,r 2.以第乙個 最後乙個數作為基準數 int part sort int q,int l,int r q l q i q i temp r...
快速排序 遞迴與非遞迴
快速排序演算法,簡稱快排,是最實用的排序演算法,沒有之一,各大語言標準庫的排序函式也基本都是基於快排實現的。快排基本思路 快速排序基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可...
快速排序實現(遞迴 非遞迴)
首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...