快速排序(quicksort)算法实现
快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元
素都比X小(从大到小排序)。然后以这个X在变换后数组的位置i分为左右两个子数组,再分别进行快速排序,直到子数组中只有一个元素为止。
快速排序算法如下
其中partition函数将得到X所在的位置i(在这里总以数组的最后一个元素为轴)。
由于总是选择数组的最后一个元素做为轴,因此可能出现X的左边为n - 1或接近n - 1个元素,而右边没有元素,或元素很少的情况,即X最大或比较大。这样使quicksort将出现最坏的情况,也就是时间复杂度为O(n^2)。因此partition可以采用随机方式得到轴X的位置i。 这样它的平均情况是非常好的(时间复杂度为O(nlogn)),也就是说,最坏情况很难出现。
完整的代码如下
快速排序算法如下
void quicksort(int A[], int p, int r)
{
int i;
if(p < r)
{
i = partition(A, p, r);
quicksort(A, 0, i - 1);
quicksort(A, i + 1, r);
}
}
{
int i;
if(p < r)
{
i = partition(A, p, r);
quicksort(A, 0, i - 1);
quicksort(A, i + 1, r);
}
}
其中partition函数将得到X所在的位置i(在这里总以数组的最后一个元素为轴)。
int partition(int A[], int p, int r)
{
int i = p - 1, j;
for(j = p; j < r; j++)
{
if(A[j] >= A[r])
{
i++;
swap(&A[i], &A[j]);
}
}
swap(&A[i + 1], &A[r]);
return i + 1;
}
{
int i = p - 1, j;
for(j = p; j < r; j++)
{
if(A[j] >= A[r])
{
i++;
swap(&A[i], &A[j]);
}
}
swap(&A[i + 1], &A[r]);
return i + 1;
}
由于总是选择数组的最后一个元素做为轴,因此可能出现X的左边为n - 1或接近n - 1个元素,而右边没有元素,或元素很少的情况,即X最大或比较大。这样使quicksort将出现最坏的情况,也就是时间复杂度为O(n^2)。因此partition可以采用随机方式得到轴X的位置i。 这样它的平均情况是非常好的(时间复杂度为O(nlogn)),也就是说,最坏情况很难出现。
int new_random(int min, int max)
{
return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
}
int randomize_partition(int A[], int p, int r)
{
int i = new_random(p, r);
swap(&A[i], &A[r]);
return partition(A, p, r);
}
{
return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
}
int randomize_partition(int A[], int p, int r)
{
int i = new_random(p, r);
swap(&A[i], &A[r]);
return partition(A, p, r);
}
完整的代码如下
#include <stdio.h>
#include <stdlib.h>
void out_int_array(int data[], int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%d ", data[i]);
}
printf("\n");
}
void swap(int *a, int *b)
{
int x;
x = *a;
*a = *b;
*b = x;
}
int new_random(int min, int max)
{
return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
}
int partition(int A[], int p, int r)
{
int i = p - 1, j;
for(j = p; j < r; j++)
{
if(A[j] >= A[r])
{
i++;
swap(&A[i], &A[j]);
}
}
swap(&A[i + 1], &A[r]);
return i + 1;
}
void quicksort(int A[], int p, int r)
{
int i;
if(p < r)
{
i = partition(A, p, r);
quicksort(A, 0, i - 1);
quicksort(A, i + 1, r);
}
}
int randomize_partition(int A[], int p, int r)
{
int i = new_random(p, r);
swap(&A[i], &A[r]);
return partition(A, p, r);
}
void randomize_quicksort(int A[], int p, int r)
{
int i;
if(p < r)
{
i = randomize_partition(A, p, r);
quicksort(A, 0, i - 1);
quicksort(A, i + 1, r);
}
}
int main()
{
int A[] = {4, 1, 44, -12, 5, 125, 30};
int B[] = {4, 1, 44, -12, 5, 125, 30};
out_int_array(A, 7);
quicksort(A, 0, 6);
out_int_array(A, 7);
printf("--------------------------randomize-----------------------------\n");
srand((unsigned)time( NULL ));
randomize_quicksort(B, 0, 6);
out_int_array(B, 7);
return 0;
}
#include <stdlib.h>
void out_int_array(int data[], int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%d ", data[i]);
}
printf("\n");
}
void swap(int *a, int *b)
{
int x;
x = *a;
*a = *b;
*b = x;
}
int new_random(int min, int max)
{
return (min + (int)(((float)rand()/RAND_MAX)*(max - min)));
}
int partition(int A[], int p, int r)
{
int i = p - 1, j;
for(j = p; j < r; j++)
{
if(A[j] >= A[r])
{
i++;
swap(&A[i], &A[j]);
}
}
swap(&A[i + 1], &A[r]);
return i + 1;
}
void quicksort(int A[], int p, int r)
{
int i;
if(p < r)
{
i = partition(A, p, r);
quicksort(A, 0, i - 1);
quicksort(A, i + 1, r);
}
}
int randomize_partition(int A[], int p, int r)
{
int i = new_random(p, r);
swap(&A[i], &A[r]);
return partition(A, p, r);
}
void randomize_quicksort(int A[], int p, int r)
{
int i;
if(p < r)
{
i = randomize_partition(A, p, r);
quicksort(A, 0, i - 1);
quicksort(A, i + 1, r);
}
}
int main()
{
int A[] = {4, 1, 44, -12, 5, 125, 30};
int B[] = {4, 1, 44, -12, 5, 125, 30};
out_int_array(A, 7);
quicksort(A, 0, 6);
out_int_array(A, 7);
printf("--------------------------randomize-----------------------------\n");
srand((unsigned)time( NULL ));
randomize_quicksort(B, 0, 6);
out_int_array(B, 7);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构