vlambda博客
学习文章列表

快速排序算法学习(C语言和python代码对比)

1、算法描述:快速排序采用分治策略来把一个序列分为两个子序列。具体步骤为:首先,从序列中挑选出一个元素,作为基准;其次,把所有比基准值小的元素放在基准前面,比基准值大的放在基准后面,这个称为分区操作;最后,对每个分区递归地进行前两步,直到满足递归结束条件(数组大小为0或1)。


首先出场的是C语言选手,

代码如下:

#include <stdio.h>#include <stdlib.h>

int partition(int a[], int left, int right){ int pivot = a[right]; //选取最右边的原素作为基准,这样的话下面遍历数组的时候比较方便 int tail = left - 1; //tail为小于基准的子数组最后一个元素的索引 int i; for(i=left; i<right; i++) //遍历基准外的其他元素 { if(a[i] < pivot) //把小于等于基准的元素放到前一个子数组的末尾 swap(a,++tail,i); } swap(a, tail+1, i); //把基准放到前一个子数组的后边,剩下的子数组即是大于基准的子数组 return tail + 1;}

void swap(int a[], int i, int j) //交换函数{ int temp; temp = a[i]; a[i] = a[j]; a[j] = temp;}

void quick_sort(int a[], int left, int right){ if(left >= right) return; int pivot; pivot = partition(a, left, right); quick_sort(a, left, pivot-1); quick_sort(a, pivot+1, right);}

int main(){ int a[] = {4,6,2,1,8,3,9,0,5}; int len=sizeof(a)/sizeof(int); //求解数组长度 int i; quick_sort(a,0,len-1); //因为数组是从零开始的,所以最后一个元素索引为长度-1 for(i=0; i<len; i++) { printf("%d",a[i]); } printf("\n"); return 0;}



接下来出场的是编程界的年轻选手Python,

代码如下:


def quicksort(a): if len(a) <= 1: #当数组长度小于等于1的时候就是有序的数组了,所以直接返回 return a pivot = a.pop() #从数组中取出最后一个元素作为基准,数组更新,除去了最后一个元素, less = [] #小于基准的元素放在less列表里 great = [] #大于基准的元素放在great列表里 for i in a: if i < pivot: less.append(i) else: great.append(i) return quicksort(less) + [pivot] + quicksort(great)