一.自编快速排序法
方案一:
#include<stdio.h>
#include<assert.h> //数据约有序,快排的效率越低,数据约无序,快排的效率约高
//划分函数
int Parition(int* br, int left, int right)
{
assert(br != nullptr);
int i = left;
int j = right;
int tmp = br[i];
while (i < j)
{
while (i<j && br[j] > tmp) --j;
if(i<j)br[i] = br[j];
while (i < j && br[i] <= tmp) ++i;
if (i < j) br[j] = br[i];
}
br[i] = tmp;
return i;
}
void QuickPass(int* br, int left, int right)
{
if (left < right)
{
int pos = Parition(br, left, right);
QuickPass(br, left, pos-1);
QuickPass(br, pos+1, right);
}
}
void QuickSort(int* br, int n) //快排
{
assert(br != nullptr);
QuickPass(br, 0, n - 1);
}
void Print_Ar(int* br,int n)
{
assert(br != nullptr);
for (int i = 0; i < n; ++i)
{
printf("%5d", br[i]);
}
printf("\n");
}
int main()
{
int ar[] = {
56,78,12,34,90,67,89,100,45 };
int n = sizeof(ar) / sizeof(ar[0]);
QuickSort(ar, n);
Print_Ar(ar, n);
return 0;
}
运行结果为:
方案二:改进快速排序法:
#include<stdio.h>
#include<assert.h> //数据约有序,快排的效率越低,数据约无序,快排的效率约高
void Swap_Int(int* ap, int* bp)
{
assert(ap != nullptr && bp != nullptr);
int tmp = *ap;
*ap = *bp;
*bp = tmp;
}
int OWParition(int* br, int left, int right) //改进后的快速排序
{
assert(br != nullptr);
int i = left;
int j = i + 1;
int tmp = br[i];
while (j <= right)
{
if (br[j] <= tmp)
{
i = i + 1;
Swap_Int(&br[i], &br[j]);
}
++j;
}
Swap_Int(&br[left], &br[i]); //此时j>right
return i;
}
//划分函数
void QuickPass(<