快排的兩種寫法

2021-10-21 05:04:25 字數 2435 閱讀 5470

快速排序,原理很簡單就是在資料找乙個定點數,把小於這個數的數放到其左邊,大於這個定點數的數放到其右邊,再把左邊的數,右邊的數再按這種方式來排序,直至無數可排.

先實現,不求空間消耗, 把小於定點的數放乙個陣列 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...