- 快排法(時間複雜度
- 選擇基準數,(通常選須要排序數組的第一個元素array[0])
- 從右往左找到第一個小於該基準數的值array[j]
- 從左往右找到第一個大於該基準值的值array[i]
- 交換i、j位置的數值
- 重複步驟2-4,直到i==j
- 此時i==j,交換基準點和位置i的數值,完成對第一個基準點的歸位
- 此時該基準點在位置i處,對位置i左右分別重複1-6步進行快排操做
/* c */
#include<stdio.h>
#include <stdlib.h>
#include <assert.h>
void quickSort(int array[], int left, int right)
{
assert(array != NULL);
//對一個數據排序,或者左下標大於有下標時,直接返回
if(left >= right)
{
return;
}
//對2個數據排序,排序返回
int left_index = left+1;
int right_index = right;
if(left_index == right_index)
{
if(array[left] > array[right])
{
int tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
return;
}
/*對多個數據快排*/
int key = array[left];
while(left_index < right_index)
{
//從右側找到第一個小於key的值
for(;right_index != left_index; right_index--)
{
if(array[right_index] < key)
{
break;
}
}
//從左側找到第一個大於key的值
for(;left_index != right_index; left_index++)
{
if(array[left_index]>key)
{
break;
}
}
int tmp = array[left_index];
array[left_index] = array[right_index];
array[right_index] = tmp;
}
if(array[left_index]>=key)
{
left_index--;
}
//將第一個基準點正確歸位
int tmp = array[left];
array[left] = array[left_index];
array[left_index] = tmp;
//對該基準點的左右分別進行快排
quickSort(array, left, left_index);
quickSort(array, right_index, right);
return;
}
class QuickSort(object):
def __init__(self,array):
assert array != None
self.array = array
def sort(self, left, right):
'''須要排序數據只有1個,或者left大於right'''
if left >= right:
return
'''須要排序數據有兩個時'''
left_index = left+1
right_index = right
if left_index == right_index:
if self.array[left] > self.array[right]:
tmp = self.array[left]
self.array[left] = self.array[right]
self.array[right] = tmp
return
'''須要排序數據超過3個時'''
key = self.array[left]
while left_index < right_index:
#先從右側查找第一個小於基準值的數值
while right_index != left_index:
if self.array[right_index] < key:
break
right_index -= 1
#從左側找第一個大於基準值的數值
while left_index != right_index:
if self.array[left_index] > key:
break
left_index += 1
tmp = self.array[left_index]
self.array[left_index] = self.array[right_index]
self.array[right_index] = tmp
if array[left_index]>=key:
left_index -= 1
#第一個基準點正確歸位
tmp = self.array[left]
self.array[left] = self.array[left_index]
self.array[left_index] = tmp
#對該基準點左右側分別進行快排
self.sort(left, left_index)
self.sort(right_index, right)
def show(self):
print("Now th array is:"),
for item in self.array:
print(item),
print("")