快速排序算法:
#include <stdio.h>
#define MAXSIZE 20
typedef struct
{
int r[MAXSIZE];
int length;
}SqList;
void swap (SqList *L, int i, int j)
{
int temp;
temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
int Patition (SqList *L, int low, int high)
{
int index;
index = L->r[low];
while(low < high)
{
while(low < high && index < L->r[high])
{
high--;
}
swap(L, low, high);
while(low < high && index > L->r[low])
{
low++;
}
swap(L, low, high);
}
return low;
}
void QSort (SqList *L, int low, int high)
{
int index;
if(low < high)
{
index = Patition(L, low, high);
QSort(L, low, index-1);
QSort(L, index+1, high);
}
}
int main ()
{
SqList L;
int i;
scanf("%d", &(L.length));
for(i = 0; i < L.length; i++)
{
scanf("%d", &(L.r[i]));
}
QSort(&L, 0, L.length-1);
for(i = 0; i < L.length; i++)
{
printf("%d\n", L.r[i]);
}
return 0;
}
快速排序算法优化:
#include <stdio.h>
#define MAXSIZE 20
typedef struct
{
int r[MAXSIZE];
int length;
}SqList;
void swap (SqList *L, int i, int j)
{
L->r[i] = L->r[i] + L->r[j];
L->r[j] = L->r[i] - L->r[j];
L->r[i] = L->r[i] - L->r[j];
}
int Patition (SqList *L, int low, int high)
{
int pivotkey, m;
m = low + (high-low)/2;//三数中值法
if(L->r[low] > L->r[high])
{
swap(L, low, high);
}
if(L->r[m] > L->r[high])
{
swap(L, m, high);
}
if(L->r[m] > L->r[low])
{
swap(L, m, low);
}
pivotkey = L->r[low];
L->r[0] = pivotkey;
while(low < high)
{
while(low < high && L->r[high] > pivotkey)
{
high--;
}
L->r[low] = L->r[high];
while(low < high && L->r[low] < pivotkey)
{
low++;
}
L->r[high] = L->r[low];
}
L->r[low] = pivotkey;
return low;
}
void QSort (SqList *L, int low, int high)
{
int index;
if(low < high)
{
index = Patition(L, low, high);
QSort(L, low, index-1);
QSort(L, index+1, high);
}
}
int main ()
{
SqList L;
int i;
scanf("%d", &(L.length));
for(i = 1; i < L.length; i++)
{
scanf("%d", &(L.r[i]));
}
QSort(&L, 1, L.length-1);
for(i = 1; i < L.length; i++)
{
printf("%d\n", L.r[i]);
}
return 0;
}