算法思想:
选取一个数据作为基准数,一般选取数组中的第一个数作为基准数。(升序)将比基准数小的数放在基准数的左边,比基准数大的数放基准数右边。把基准数左边和右边的数据再看成两个新的数组,再次使用上述方法选取基准数,调整基准数的位置(递归),直到区间只剩一个数据。
代码:
void quick_sort(int *array,int start,int end){
int pos = position(array,start,end);
if(start<end){
quick_sort(array,start,pos-1);
quick_sort(array,pos+1,end);
}
}
根据算法思想,先确定基准数的位置,当区间正确时(起始位置小于结束位置)递归分治,解决左边数据和右边数据。这里的position()函数实现了将小于基准数的数据放在基准数左边,比基准数大的数放在基准数的右边,并且返回基准数调整后的位置。下面给出position()函数具体代码。
int position(int *array,int start,int end){
int mid = *(array+start);
int i=start;
int j=end;
while(i<j){
while(*(array+j)>=mid&&i<j) j--;
while(*(array+i)<=mid&&i<j) i++;
int tmp = *(array+i);
*(array+i)=*(array+j);
*(array+j)=tmp;
}
*(array+start)=*(array+i);
*(array+i)=mid;
return i;
}
首先,先将基准数保存起来(不然一会移动起来就找不到它了,就无法完成比较,交换等操作),别忘了设置两个指针,分别指向起始位置与结束位置(这里的指针只是表示数据的位置,代码中分别为i和j),i用来从左边开始找,找到比基准数大的数(比基准数大的数要放右边嘛),j从右边开始找,找到比基准数小的数(比基准数小的数要放左边),然后交换i和j所指向的数据,这样就把比基准数小的数换到了左边,比基准数大的数换到了右边。然后继续找下一对需要交换的数据(所以需要一个循环结构,将所有需要交换的数据交换)当i=j的时候,就意味着j右边的所有数据都比基准数大,i左边的所有数据都比基准数小(毕竟,刚才不符合的数据都被换走了),同时也意味着i,j就是基准数的位置(所以交换完数据,别忘了把基准数放到它的新位置上)。
一些题外话:
上述代码,采用C语言编写,数组使用指针的形式传入,这么写完全是被考试逼迫,哈哈哈。其实也可以以数组的形式传入,我不太清楚为啥力扣和学校都喜欢用指针传入函数,有知道的大佬麻烦告诉小弟一声,小弟在此谢过了。
我还发现python在实现上述算法时有点赖皮,Python的列表有两个特别的东西,一个是切片,一个是列表推导式。这导致Python实现的时候可以跳过数据交换的步骤,直接获得比基准数大,和比基准数小的列表,整体代码量相较于C语言少了很多,也更简单易读,但这样写显然是使用了更多的空间。(代码如下)
def quick_sort(a):
if len(a)>1:
ll = [i for i in a[1:] if i <= a[0]]
lr = [i for i in a[1:] if i > a[0]]
x = quick_sort(ll)
y = quick_sort(lr)
return x + [a[0]] + y
else:
return a