您的位置:首页 > 其它

快速排序

2017-04-06 10:57 169 查看

快速排序

描述

​快速排序的基本采用分治的思想通过每一趟的排序将数据分割成两部分,左边的一部分全部不大于主元素,右边的一部分不小于主元素,然后再递归的对着两部分元素进行分割,最终变成有序序列。

​ 快速排序的基本步骤:

​ 1、从数据序列中取出一个主元素也就是作为参考点;

​ 2、将左边大于主元素的数据交换到主元素的右边;

​ 3、通过递归不断的遍历主元素的左右两边的元素,最终实现元素的有序。

示意图:



C语言源码:

/**
*   快速序算法(L为要进行排序的线性顺序表)
*/

typedef int type;
void print_array(type *L, int len, char *msg);
/**
*   用于交换元素
*/
void swap(type *a, type *b)
{
type tmp = *a;
*a = *b;
*b = tmp;
}
/**
*   L   为type类型的可进行大小对比的线性顺序表
*   len 为线性顺序表的长度
*/

/**
*  划分数据序列为主元素的左边全部不小于主元素,主元素的左边全部不大于主元素(核心)
*/
int partition(type *L, int low, int high)
{
type tmp = L[high];
int i = low - 1;                    //跟踪当前大于主元素的下标
int j = 0;                          //遍历当前区间的下标
for (j = low; j < high; j++)
{
if (L[j] <= tmp)
{
i++;
swap(&L[i], &L[j]);
}
}

swap(&L[i + 1], &L[high]);
//print_array(L, ARRAY_SIZE, "排序中:");
return i + 1;
}

/**
*  递归的对序列进行调整
*/
void quick_sort(type *L, int low, int high)
{
if (low < high)
{
int mid = partition(L, low, high);
quick_sort(L, low, mid - 1);
quick_sort(L, mid + 1, high);
}
}


快速排序的效率:

最坏情况为O(n2)

最好情况为O(nlogn)

改进:

因为快速排序算法的特性,序列的随机性越好相对来说算法的效率就越高,而实际遇到的数据不太可能遵循我们的预期,因此可以人为的打乱数据,将数据进行随机化处理,再次调用快速排序进行排序效率。

int random_partition(type* L, int low,int high)
{
srand(time(NULL));
int i = rand()%high + low;
swap(&L[low],&L[i]);
return partition(L,low,high);
}

void random_quicksort(type *L, int low, int high)
{
if(low < high)
{
int mid = random_partition(L,low,high);
random_quicksort(L,low, mid - 1);
random_quitsort(L,mid + 1,high);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  快速排序