本文将详细说明如何用C语言实现快速排序。边肖觉得挺实用的,就分享给大家参考。希望你看完这篇文章能有所收获。
密码
#定义_阴极射线管_安全_否_警告1
//快速排序,递归求解
# includestdio.h
voidswap(int*a,int*b)
{
intc=0;
c=* a;
* a=* b;
* b=c;
}
无效比较(intarr,intone,意愿)
{
int first=1;//最左边数组的索引
intlast=end//右数组下标
intkey=first//用于比较的标量(选择第一个最左边的元素)
if(第一个=最后一个)
{
返回;
}
while(第一个最后一个)
{
while(first startarr[last]=arr[key])//找一个比右边标量小的数字。
{
最后-;
}
while(first startarr[first]=arr[key])//在左边找到一个大于标量的数字。
{
首先;
}
If(firstlast)//分析交易所发现的价值。
交换(arr[first],arr[last]);
}
if(first==last)
{
intmite=key//将标量切换到应该去的位置,重新选择标量。
交换(arr[mite],arr[last]);
}
比较(arr,1,first-1);//左侧递归排序
比较(arr,前1,结束);//右侧的递归排序
}
intmain()
{
intar[]={ 5,4,6,5,2,1 };
inti=0;
int len=sizeof(arr)/4;
比较(arr,I,len-1);//传递第一个和最后一个元素的下标
for(I=0;伊琳;(一)
{
printf('%d ',arr[I]);
}
返回0;
}首先,什么是快速排序:快速排序是Tony Hall开发的一种排序算法。平均来说,对n个项目进行排序需要 (nlogn)次比较。在最坏的情况下,需要进行 (N2)比较,但这种情况并不常见。事实上,快速排序通常明显快于其他 (NLOGN)算法,因为其内部循环可以在大多数架构中高效实现。
快速排序最差的情况是O (n),例如序列序列的快速排序。但其平均期望时间为O(nlogn),O(nlogn)符号中隐含的常数因子很小,比复杂度稳定等于O(nlogn)的合并排序小得多。因此,对于大多数弱序的随机序列,快速排序总是优于合并排序。
快速排序使用分治策略将一个列表分成两个子列表。
简单地说,选择一个基准(这里的第一个数据)并与其他数据进行比较,这样较小的数据在它的前面,较大的数据在它的后面。然后将基准分为两部分(比它大的部分和比它小的部分),分别选择两部分的基准,然后进行比较。比较后,分割重复,直到每个部分只有一个数据时排序结束。
图表-
00-1010 1.首先,我们需要创建一个数组,数组的第一个数据下标和最后一个数据下标。该数组用于存储数据,然后为快速排序功能创建一个Compare()。最后,我们需要打印出有序的序列。
pre class="brush:cpp;">int main()
{
int arr[] = { 5,4,6,5,2,1};
int i = 0;
int len = sizeof(arr) / 4;
Compare(arr,i,len-1);//传第一个和最后一个元素的下标
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
return 0;
2、Compare()函数创建
这里使用无符号返回类型,因为不需要返回值
为保证数组第一个元素和最后一个元素下标不变,创建first和last两个局部变量记录数组第一个元素和最后一个元素的下标
创建key下标的数据作为基准
void Compare(int arr[], int one, int end) { int first = one;//最左边数组下标 int last = end;//最右边数组下标 int key = first;//用于比较的标量(选取最左边第一个元素)
3、首先判断数列是否只有一个元素,如果只有一个元素,则函数结束。
4、开始实现函数主要比较部分
4.1、如果选取左边第一个数据为基准,先从右边开始比较,
4.2、从右边第一个数据开始与key进行比较,如果比它大则继续向右比较(last--),直到找到比key小的数据,便停下来。
4.3、此刻开始从左边开始与key比较,如果比key小则继续比较(first++),如果比key大则与右边找到的比key大的数进行交换。然后右边继续找,重复以上步骤。
4.4、直到first>=last时,都停止寻找,并交换此时first下标的数据与key的值
4.5、分治思想,以此时的key下标的数组作为分界,分为比它大的、比它小的两部分,在重复以上步骤,直至只有一个数据为止,停下排序。采用递归求解。
void Compare(int arr[], int one, int end) { int first = one;//最左边数组下标 int last = end;//最右边数组下标 int key = first;//用于比较的标量(选取最左边第一个元素) if (first >= last) { return; } while (first < last) { while (first < last && arr[last] >= arr[key])//右边找比标量小的数 { last--; } while (first < last && arr[first] <= arr[key])//左边找比标量大的数 { first++; } if(first < last)//分析交换找出来的值 swap(&arr[first], &arr[last]); } if (first == last) { int mite = key;//交换标量到它应该到的位置上,重新选取标量 swap(&arr[mite], &arr[last]); } Compare(arr,one,first-1);//左边递归排序 Compare(arr,first+1,end);//右边递归排序 }
swap()交换函数,因为需要影响到交换函数外的值,使用指针形参。
void swap(int* a, int* b) { int c = 0; c = *a; *a = *b; *b = c; }
关于“C语言如何实现快速排序算法”这篇文章就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153081.html