当前位置:首页 » 编程语言 » c语言中的快速排序
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言中的快速排序

发布时间: 2022-09-01 05:42:40

c语言快速排序

俺博客里面有啦,参考自己写的,不好请指教:
http://hi..com/djpangxie/blog/item/572cc9d0ee5546da562c8414.html

❷ C语言,快速排序算法

你好!
首先0,n-1。应该是数组的坐标(因为n个数字。所以数组的坐标是0到n-1)
而a是你传入的数组。所以他会根据数组的坐标到数组中找到元素。比较并进行排序。
递归这段理解如下:
首先要了解快速排序的思想:
1)随意找一个基准数。将比基准小的都放到它左边。比它大的都放到它右边。所以当返回基准的坐标的时候。其实这个坐标左边都是小于它的,右边都是大于等于它的。(这里主要是看代码的实现。图中代码是大于等于在右边。也可以自己写小于等于在左边。这个不影响最后结果)
2)那么第二次对于返回基准坐标的左右两边。我们同样利用返回的基准坐标找到两个“基准”(如下图)。就会使得返回的这两个基准左右两边有序
第三次用返回的两个基准找到四个基准(如图)
然后不断递归..不断的在整体有序的情况下使局部变的有序。
假设为532348789
第一次以a【0】5为基准。
则:


图中红色标识为基准元素最后会使得数组全局有序。
希望能对你有所帮助。

❸ c语言中排序方法

1、冒泡排序(最常用)
冒泡排序是最简单的排序方法:原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。(注意每一轮都是从a[0]开始比较的)

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

2、鸡尾酒排序
鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
原理:数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。

3、选择排序
思路是设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最大的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。

4、插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素*
一般来说,插入排序都采用in-place在数组上实现。
具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5

❹ 数据结构(c语言)中快速排序什么时候排序最慢,什么情况下使用快速排序

当待排序的序列已经有序(不管是升序还是降序),此时快速排序最慢,一般当数据量很大的时候,用快速排序比较好,为了避免原来的序列有序,一般采用改进的快速排序算法,在排序之前随机交换两个元素的位置,就可以达到目的了,有一本书,叫《算法设计、分析与实现:C、C++和java》徐子珊着。可以看看,里面写了很多基本的算法

❺ C语言的快速排序的算法是什么啊

就是一种算法,
算法的时间复杂度为
nlgn。
是一种排序速度很快的算法,
同时也是不稳定排序算法!

❻ 快速排序算法c语言

quick明显有问题,1.存在死循环2.使用递归是想实现什么?

如果想实现快速排序的话可以参考一下程序段,尽量精简交换操作增加排序速度:

voidquick(int*arr,intlen)
{
inti,j,k,z;
for(i=0;i<len-1;i++)
{
for(j=0,k=0;j<len-i-1;j++)
{
if(arr[k]<arr[j+1])
k=j+1;
}
if(k!=len-i-1)
{
z=arr[len-i-1];
arr[len-i-1]=arr[k];
arr[k]=z;
}
}
}

❼ C语言中的一趟快速排序问题

第一,你main里面,把一个没有分配内容的指针L拿来直接用就错了。

第二,quicksort是分而治之,是逐层分。每次partition之后,分成两部分,一边比哨兵小,一边比哨兵大。应该对于这两部分分别继续quicksort。递归的做。你只partition了一次,所以,这一次能不能正好排对就靠运气了。

我给你改了一下,你看看对不对。

#include<stdio.h>
#defineMAXSIZE1000

typedefstruct
{
intr[MAXSIZE+1];
intlength;
}SqList;

voidswap(SqList*L,inti,intj)
{
inttemp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}

intPartition(SqList*L,intlow,inthigh)
{
intpivotkey;
pivotkey=L->r[low];
while(low<high)
{
while(low<high&&L->r[high]>=pivotkey)
high--;
swap(L,low,high);
while(low<high&&L->r[low]<=pivotkey)
low++;
swap(L,low,high);
}
returnlow;
}

voidQuickSort(SqList*L,intlow,inthigh){
intkey=Partition(L,low,high);
if(key>low+1)
QuickSort(L,low,key-1);
if(key<high-1)
QuickSort(L,key+1,high);
}

intmain()
{
SqListL;
inti,j;
intlow=0,high;
printf("请输入排序个数:");
scanf("%d",&i);
high=i-1;
printf("请输入元素:");
for(j=0;j<i;j++)
{
scanf("%d",&L.r[j]);
}
QuickSort(&L,low,high);
for(j=0;j<i;j++)
{
printf("%d",L.r[j]);
}

}

❽ C语言快速排序代码

采用快速排序,用递归实现
#include <stdio.h>
#define N 10 //定义排序数组元素个数
int Qsort(int start,int length,int a[])//start排序的起始,length是要排序序列长度
{
int x = a[start];
int i,j;
i = start;
j = length -1;
while(i < j)
{
if(x < a[j])
j--;
else if(x > a[j])
{
a[i] = a[j];
a[j] = x;
i++;
}
else if(x < a[i])
{
a[j] = a[i];
a[i] = x;
j--;
}
else
i++;
}
if(start < length-1)
{
Qsort(start,i,a);
Qsort(i+1,length,a);
}
}

void main()
{
int a[N] = {0};
int i;
for(i = 0;i < N;i++)
scanf("%d",&a[i]);
Qsort(0,N,a);
for(i = 0;i < N;i++)
printf("%d ",a[i]);
}
程序执行时输入N个数,对这N个数进行排序,可以预设N的长度

❾ C语言快速排序

排序快慢得看你提供了多少数据,因为数据量的不同,选择最快的方法也不同。

❿ 用C语言编程实现快速排序算法

给个快速排序你参考参考

/**********************快速排序****************************
基本思想:在待排序的n个记录中任取一个记录(通常取第一个记录),
以该记录为基准,将当前的无序区划分为左右两个较小的无
序子区,使左边的记录均小于基准值,右边的记录均大于或
等于基准值,基准值位于两个无序区的中间位置(即该记录
最终的排序位置)。之后,分别对两个无序区进行上述的划
分过程,直到无序区所有记录都排序完毕。
*************************************************************/

/*************************************************************
函数名称:staticvoidswap(int*a,int*b)
参数:int*a---整型指针
int*b---整型指针
功能:交换两个整数的位置
返回值:无
说明:static关键字指明了该函数只能在本文件中使用
**************************************************************/
staticvoidswap(int*a,int*b)
{
inttemp=*a;
*a=*b;
*b=temp;
}

intquickSortNum=0;//快速排序算法所需的趟数
/*************************************************************
函数名称:staticintpartition(inta[],intlow,inthigh)
参数:inta[]---待排序的数据
intlow---无序区的下限值
inthigh---无序区的上限值
功能:完成一趟快速排序
返回值:基准值的最终排序位置
说明:static关键字指明了该函数只能在本文件中使用
**************************************************************/
staticintpartition(inta[],intlow,inthigh)
{
intprivotKey=a[low];//基准元素
while(low<high)
{//从表的两端交替地向中间扫描
while(low<high&&a[high]>=privotKey)//找到第一个小于privotKey的值
high--;//从high所指位置向前搜索,至多到low+1位置
swap(&a[low],&a[high]);//将比基准元素小的交换到低端

while(low<high&&a[low]<=privotKey)//找到第一个大于privotKey的值
low++;//从low所指位置向后搜索,至多到high-1位置
swap(&a[low],&a[high]);//将比基准元素大的交换到高端
}
quickSortNum++;//快速排序趟数加1
returnlow;//返回基准值所在的位置
}

/*************************************************************
函数名称:voidQuickSort(inta[],intlow,inthigh)
参数:inta[]---待排序的数据
intlow---无序区的下限值
inthigh---无序区的上限值
功能:完成快速排序算法,并将排序完成的数据存放在数组a中
返回值:无
说明:使用递归方式完成
**************************************************************/
voidQuickSort(inta[],intlow,inthigh)
{
if(low<high)
{
intprivotLoc=partition(a,low,high);//将表一分为二
QuickSort(a,low,privotLoc-1);//递归对低子表递归排序
QuickSort(a,privotLoc+1,high);//递归对高子表递归排序
}
}