下面简单的快速排序代码,最后一个元素作为pivot,几乎可以工作,但除了最后一个元素无法排序。有什么想法这个程序出错?
这是输出:
$a.out
4 3 5 2 1 3 2 3 //input
1 2 2 3 3 3 5 4 //output
简单交换看起来很好
void swap ( int* a, int* b )
{
int t = *a;
*a = *b;
*b = t;
}
嗯..也可以.. end
的问题?
int partition(int a[],int start,int end){
int pivot = a[end];
int pindex=start;int i;
for ( i=start; i <= end-1; i++){
if (a[i] <= pivot){
swap(&a[i],&a[pindex]);pindex++;
}
}
swap(&a[pindex],&a[pivot]);
return (pindex + 1);
}
当然看起来不错。
void quicksort(int a[],int start,int end){
int pindex;
if (start < end){
pindex = partition(a,start,end-1);
quicksort(a,start,pindex-1);
quicksort(a,pindex+1,end);
}
}
简单的主要电话
int main(){
int a[8] = {4, 3, 5, 2, 1, 3, 2, 3};
int i=0;
for(i=0;i<8;i++)
printf(" %d", a[i]);
quicksort(a,0,8);
printf("\n");
for(i=0;i<8;i++)
printf(" %d", a[i]);
}
答案 0 :(得分:2)
好的一些变化
由于doptimusprime指向返回pindex
int partition(int a[],int start,int end){
int pivot = a[end];
int pindex=start;int i;
for ( i=start; i <= end-1; i++){
if (a[i] <= pivot){
swap(&a[i],&a[pindex]);pindex++;
}
}
swap(&a[pindex],&a[end]);
return (pindex);
}
相应地调整快速排序功能
void quicksort(int a[],int start,int end){
int pindex;
if (start < end){
pindex = partition(a,start,end-1);
quicksort(a,start,pindex); // no pindex-1
quicksort(a,pindex+1,end);
}
}
答案 1 :(得分:0)
请查看partition
功能。
它应该返回
return pindex;
而不是pindex+1
。
因为,请采取以下案例:
1 2 3 4 5
选择5
作为支点时,它应返回4
,而不是5
作为支点索引。
检查pindex
必须位于开始和结束(包括两者)之间的不变量。如果枢轴位于末端,则它不能越过末端。
通常,分区从两端开始。你是从一端开始的。尽量做到最后提高效率。否则,在1 2 3 4 5
中,您将继续使用相同的元素交换(1与1,2与2等等)。
在分区中:
swap(&a[pindex],&a[pivot]);
应该是
swap(&a[pindex],&a[end]);
pivot
是一个值,而不是索引。
另一项更改,您需要quicksort
,
if (start < end){
pindex = partition(a,start,end-1);
//As here index is one past last, so make it start..pindex
quicksort(a,start,pindex);
quicksort(a,pindex+1,end);
}
你的分区功能应该是
int partition(int a[],int start,int end){
int pivot = a[end];
int pindex=start;int i;
for ( i=start; i <= end-1; i++){
if (a[i] <= pivot){
swap(&a[i],&a[pindex]);pindex++;
}
}
swap(&a[pindex],&a[end]);
return (pindex);
}
见https://en.wikipedia.org/wiki/Quicksort#Lomuto_partition_scheme。此处使用此分区方案。
答案 2 :(得分:0)
如果有人输入负数,您的程序将失败。 你为什么要这样复杂化?
这是一个简单的排序:
#include <stdio.h>
void bubble_sort(int *array, int length){
int i,j, k, temp;
for (i = 0 ; i < length-1; i++){
for (k = 0 ; k < length-i-1; k++){
if (array[k] > array[k+1]){
temp = array[k];
array[k] = array[k+1];
array[k+1] = temp;
}
}
}
printf("The sorted Array List:\n\n");
for ( j = 0 ; j < length ; j++ ){
printf("%d ", array[j]);
}
}
int main(void){
int array[8] = {4, 3, 5, 2, 1, -1, 2, 3};
int length = sizeof array / sizeof array[0];
bubble_sort(array, length);
printf("\n");
return 0;
}
输出:
-1 1 2 2 3 3 4 5