快速排序,原理很簡單就是在資料找乙個定點數,把小於這個數的數放到其左邊,大於這個定點數的數放到其右邊,再把左邊的數,右邊的數再按這種方式來排序,直至無數可排.
先實現,不求空間消耗, 把小於定點的數放乙個陣列 b, 把大於定點的數的放乙個陣列 c, 再把它們拷回陣列 a
int quick_sort(int *a, int begin ,int end)
int size = end - begin + 1;
int *b = malloc(size*sizeof(int));
int *c = malloc(size*sizeof(int));
int i;
int j;
int k;
int value = a[end];
j = 0;
k = 0;
for(i = begin ; i < = end;i++ )else
} for(i = 0; i < j ; i++)
a[i] = value;
for(i = 0; i < k ; i++)
free(b);
free(c);
quick_sort(a, begin, j - 1);
quick_sort(a, j+1, end);
return 0;
}void show(int *a, int size)
printf("\n");
}int main();
int size= sizeof(a)/sizeof(int)- 1;
quick_sort(a, 0, size);
show(a, size);
quick_sort2(a, 0, size);
show(a, size);
return 0;
}
下面再做空間優化, 陣列 a, 起始位置 begin, 結束位置 end
第一種:
設定比較點 value = a[end],i = begin
從左開始找到 >= value 的數的位置 i , 並設 j = i + 1
從 j 開始向右, 找到 a[j] < value 的位置
找到, 交換 i, j 兩位置的值, 再返回到第 2 步
沒有找到, 交換 i, end 兩位置的值
第二種:
設定比較點 value = a[end], pos = end, i = begini, j = end
從左開始找到 >= value 的數的位置 i , a[i] = a[pos], pos = i
從右開始找到 < value 的數的位置 j, a[j] = a[pos], pos = j
沒有結束,返回到第2步
第一種,可能要少些交換次數, 快排是一種分治法,分治法結構是乙個 tree 遞迴結構,即排序過程展開是乙個樹狀結構.
把**放在下面:
#include void swap(int *a, int i, int j)
int quick_sort2(int *a, int begin ,int end)
int i;
int j;
int value = a[end];
i = begin;
while(a[i] < value && i < end)
for(j = i+1; j < end; )
j++;
} swap(a,i, end);
quick_sort2(a, begin, i - 1);
quick_sort2(a, i+1, end);
return 0;
}int quick_sort(int *a, int begin ,int end)
int i;
int j;
int value = a[end];
for(i = begin, j = end; i < j; )
a[j] = a[i];
while(a[j] >= value && i < j)
a[i] = a[j];
} a[i] = value;
quick_sort(a, begin, i - 1);
quick_sort(a, i+1, end);
return 0;
}void show(int *a, int size)
printf("\n");
}int main();
int size= sizeof(a)/sizeof(int)- 1;
quick_sort(a, 0, size);
show(a, size);
quick_sort2(a, 0, size);
show(a, size);
return 0;
}
排序 快排的兩種寫法
之前的部落格記錄過各種排序 快排演算法 如下,該方法思路很直接也很清晰,但是在生成left和right時會需要新的空間,所以其空間複雜度要高一些。def quick sort li if len li 2 return li tmp li 0 快排中將序列分為左右的值 left x for x in...
快排的兩種partition函式
partition函式就是快排的關鍵部分,作用是將陣列劃分成兩部分,左邊小於基數,右邊大於基數 但實際上它也不僅僅用於快排,在求top k 問題中也常常會用到。下面介紹兩種partition函式,他們都是雙指標的方法,但具體會有差異 函式一 頭尾指標向中間夾 def partition array,...
快排的java兩種實現方式
快排是最基礎的幾個排序演算法之一,今天再來回顧下 public class quicksort private static void quicksort int array,int beg,int end 上面就是快排主要的框架,最重要就是partition方法,它是劃分並找到下次分割排序的位置p...