C# · 12月 19, 2021

C语言实现快速排序改进版

利用三者取中法改进快速排序,具体内容如下

实现取数组中第一个,中间和最后一个元素的中间元素作为划分元素(否则将这些元素排除在划分过程之外).大小为11或更小的数组在划分过程中被忽略,然后使用插入排序来完成排序.

#include

#include

#include

#include

#include

#include

using namespace std;

#define OK 1

#define ERROR -1

#define TRUE 1

#define FALSE 0

typedef int Status;

//输出函数

void Print(int a[],int l,int r)

{

int i;

for(i = l; i <= r; i++)

{

printf(“%d “,a[i]);

}

printf(“n”);

}

//插入排序的改进

void Insertion(int a[],int r)

{

int i,j;

//循环找到数组中的最小值

for(i = r; i > l; i–)

{

if(a[i-1] > a[i])

{

swap(a[i-1],a[i]);

}

}

//由于上面的循环,a[0]a[1]已经有序

for(i = l+2; i <= r; i++)

{

int temp = a[i];

j = i;

//此时a[j]的位置已被记录

//while循环比较进行移位操作

while(temp < a[j-1])

{

a[j] = a[j-1];

j–;

}

//将记录下的值放到应当的位置

a[j] = temp;

}

}

//划分函数

int partion(int a[],int left,int right)

{

//取最右边的元素作划分元素

int temp = a[right];

//记录 i = left,j = right

int i = left,j = right-1;

//循环直到左右指针相遇

while(true)

{

//从左边开始扫描,当出现比划分元素大的元素,扫描停止

while(temp > a[i])

{

i++;

}

//从右边进行扫描,当出现比划分元素小的元素,扫描停止

while(temp = left)

{

j–;

}

//如果 i >= j,循环截止,下面的交换不执行

if(i >= j) break;

//交换停止时的元素

swap(a[i],a[j]);

}

//交换该元素与划分元素

swap(a[i],a[right]);

//printf(“i = %dn”,i);

//Print(a,6);

//划分过程结束

return i;

}

void qsort(int a[],int right)

{

int i;

if(right-left <= 10)

return;

swap(a[(left+right)/2],a[right-1]);

if(a[left] > a[right-1])

swap(a[left],a[right-1]);

if(a[left] > a[right])

swap(a[left],a[right]);

if(a[right] > a[right-1])

swap(a[right-1],a[right]);

i = partion(a,left+1,right-1);

qsort(a,left,i-1);

qsort(a,i+1,right);

}

void Sort(int a[],int right)

{

qsort(a,right);

Insertion(a,right);

}

int main()

{

int a[12] = {2,5,3,7,6,1,4,11,8,10,9,12};

//快速排序改进

printf(“对0~11排序n”);

Sort(a,11);

Print(a,11);

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。