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

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

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

#include <cstdio>

#include <cstdlib>

#include <algorithm>

#include <stack>

#include <queue>

#include <malloc.h>

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 l, 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 < a[j] && j >= left)

{

j--;

}

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

if(i >= j) break;

//交换停止时的元素

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

}

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

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

//printf("i = %d\n", i);

//Print(a, 0, 6);

//划分过程结束

return i;

}

void qsort(int a[], int left, 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 left, int right)

{

qsort(a, left, right);

Insertion(a, left, right);

}

int main()

{

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

//快速排序改进

printf("对0~11排序\n");

Sort(a, 0, 11);

Print(a, 0, 11);

return 0;

}

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

以上是 C语言实现快速排序改进版 的全部内容, 来源链接: utcz.com/z/318999.html

回到顶部