快速排序算法的递归实现的个人理解
关于快速排序,该算法实现原理是将要排序的一组数据根据一个被选中的数据,以这个数据为中心将数据分成两侧,一侧大一侧小,使用递归,将分好的两组数据分别进行再次分组,直至不能再分,这时排序则排序完毕。
因此快速排序算法的中心应该是如何根据选中的数据将数据分成两组,而这里这个选中的数据则直接默认为数据组的第一个数据,虽然在一些情况下可能很慢,但大多数情况是比一般排序算法快的。
下面提供一下根据一个数将数组划分成两部分的算法(C#实现)
//k为中间数,这里的这个函数和下面快排的实现有一点不同,这里的k可以是数组的元素,也可以不是,而快排由于是指定了第一个元素为界,所以简化了一下代码
public void sort(int[] array,int k){
int start = 0;
int end = array.Length - 1;
while(start<end){ while (start <= end && array[end] >= k) { --end;
}
while (start <= end && array[start] < k) { ++start;
}
//交换头尾
if(start <= end){ array[start] ^= array[end];
array[end] ^= array[start];
array[start] ^= array[end];
++start;
--end;
}
}
//这里的start则是k在划分后的数组所在的下标 Console.WriteLine(start);
}
而快速排序的C++实现如下(这里是升序排法):
void quick_sort(array<int,19> arr,int start,int end){
if(start<end){//递归结束条件
int first = start;
int last = end;
int flag = arr[start];
while(first<last){
//start和end为函数传进来的数组的头和尾,使用两个变量保存
int first = start;
int last = end;
//保存被选中的数,这里直接使用第一个元素,也可以通过计算出头,尾,中间三个值,取出中值与第一个元素交换位置,确保最坏情况不会发生
int flag = arr[start];
//这个while循环是为了将数组以一个数为界分割成一大一小的两部分,这里是将start所在的数当作中间数
while(first<last){
while(first<last&&arr[last]>=flag){
--last;
}
//从尾部开始遍历查找比被选中的数小的数,并将它放在头的位置
//由于是将start所在的数当作中间数,所以不用保存start的值
arr[first]=arr[last];
while(first<last&&arr[first]<=flag){
++first;
}
//接着从头部开始遍历查找比被选择的数大的数,并将它放在尾的位置
arr[last]=arr[first];
}//如果头尾没有碰头,则继续进行比较,确保以被选中的数为界的左右两侧数据组一大一小
arr[first]=flag;//将被选中的数放在两组数据的中间
//使用递归再次排序
quick_sort(arr,start,first-1);
quick_sort(arr,first+1,end);
}
}