快速排序的原理
一般选取带排序数组的最后一个元素作为关键字(key) ,然后设置2个指针 i(用来指向数组中小于等于key的元素) 和 j 。假如 j 指针指向数组中的元素比key要小于或者等于,那么就会交换 i 指针和j指针指向的值,按照上述规则遍历完数组结束后,交换i+1指针指向的值和end 指针指向的值。这样得到的结果是 i+1之前的元素都要比i+1这个位置的元素要小于或者等于,i+1之后的元素都要比i+1这个位置的元素要大。此时i+1这个位置上的元素已经是排好序的了。
例如 1,8,2,3,5,6,0,2 key 为 2,首先 j指向1 ,1比key要小所以对 i 执行++,i指向1,i和j进行交换(1,1交换),得到 1,8,2,3,5,6,0,2。接下来j执行++ ,j指向8,8比key要大,i还是指向1 并且 j++, j指向2,因为2 <= key 所以执行 i++ 并接交换i和j指向的值(8和2交换)得到 1,2,8,3,5,6,0,2,同理向下执行 i一直指向2(因为除了0外剩下的值都比key大),当遇到 0,交换i和j指向的值(8和0交换)得到 1,2,0,3,5,6,8,2. 循环结束后 i指向0元素所在位置 然后i+1和key交换(3和2交换)得到 1,2,0,2,5,6,8,3.
上述过程完成后 key之前的所有值都比key要小于或者等于,key之后的所有值都比key大,并且key的位置已经是排序好的。
快速排序执行完上述过程后 以key为分界分别对左边和右边递归的进行上述过程,直到序列排序完成。
int Partition(int *array,int start,int end)
{
int key = array[end];
int i = start - 1;
for (int j = start; j < end; j++)
{
if (array[j] <= key)
{
i = i + 1;
exchange(&array[i], &array[j]);
}
}
exchange(&array[i + 1], &array[end]);
return i + 1;
}
void Quack_Sort(int* array, int start, int end)
{
if (start < end)
{
int divLoc = Partition(array, start, end);
Quack_Sort(array, start , divLoc - 1);
Quack_Sort(array, divLoc + 1, end);
}
}
时间复杂度:O(n*lgn)
最坏:O(n^2)
空间复杂度:O(n*lgn)
不稳定。
快速排序是一种排序算法,对包含n个数的输入数组,平均时间为O(nlgn),最坏情况是O(n^2)。
通常是用于排序的最佳选择。因为,排序最快,也只能达到O(nlgn)。