Ⅰ 快速排序算法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语言编写一个快速排序算法 输入10个数
1、“快速排序法”使用的是递归原理,下面一个例子来说明“快速排序法”的原理。首先给出一个数组{53,12,98,63,18,72,80,46, 32,21},先找到第一个数--53,把它作为中间值,也就是说,要把53放在一个位置,使得它左边的值比它小,右边的值比它大。{21,12,32, 46,18,53,80,72,63,98},这样一个数组的排序就变成了两个小数组的排序--53左边的数组和53右边的数组,而这两个数组继续用同样的方式继续下去,一直到顺序完全正确。一般来说,冒泡法是程序员最先接触的排序方法,它的优点是原理简单,编程实现容易,但它的缺点就是速度太慢。
2、快速排序代码:
#include<stdio.h>
voidquicksort(inta[],intleft,intright)
{
inti,j,temp;
i=left;
j=right;
temp=a[left];
if(left>right)
return;
while(i!=j)
{
while(a[j]>=temp&&j>i)
j--;
if(j>i)
a[i++]=a[j];
while(a[i]<=temp&&j>i)
i++;
if(j>i)
a[j--]=a[i];
}
a[i]=temp;
quicksort(a,left,i-1);
quicksort(a,i+1,right);
}
voidmain()
{
inta[]={53,12,98,63,18,72,80,46,32,21};
inti;
quicksort(a,0,9);
/*排好序的结果*/
for(i=0;i<10;i++)
printf("%4d ",a[i]);
}
Ⅲ 请问c语言里面,最快的稳定排序法是什么
归并排序
建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
该算法时间复杂度为稳定的O(nlog(n)).
Ⅳ 用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);//递归对高子表递归排序
}
}
Ⅳ C语言,快速排序算法
你好!
首先0,n-1。应该是数组的坐标(因为n个数字。所以数组的坐标是0到n-1)
而a是你传入的数组。所以他会根据数组的坐标到数组中找到元素。比较并进行排序。
递归这段理解如下:
首先要了解快速排序的思想:
1)随意找一个基准数。将比基准小的都放到它左边。比它大的都放到它右边。所以当返回基准的坐标的时候。其实这个坐标左边都是小于它的,右边都是大于等于它的。(这里主要是看代码的实现。图中代码是大于等于在右边。也可以自己写小于等于在左边。这个不影响最后结果)
2)那么第二次对于返回基准坐标的左右两边。我们同样利用返回的基准坐标找到两个“基准”(如下图)。就会使得返回的这两个基准左右两边有序
第三次用返回的两个基准找到四个基准(如图)
然后不断递归..不断的在整体有序的情况下使局部变的有序。
假设为532348789
第一次以a【0】5为基准。
则:
图中红色标识为基准元素最后会使得数组全局有序。
希望能对你有所帮助。
Ⅵ c语言怎样实现快速排序
include<stdio.h>
int arr_num[];
int length;
void quick_sort(int left, int right)
{
int i, j, c, temp;
if(left>right)
return;
i= left;
j= right;
temp = arr_num[i]
while(i != j)
{
while(arr_num[j]>=temp && i<j)
{
j--;
}
while(arr_num[i]<=temp && i<j)
{
i++;
}
if(i<j)
{
c = arr_num[i];
arr_num[i] = arr_num[j];
arr_num[j] = c;
}
}
//left为起始值(参照值)此时的I为第一次排序结束的最后值,与参照值交换位置
arr_num[left] = arr_num[i];
arr_num[i] = temp;
//继续递归直到排序完成
quick_sort(left, i-1);
quick_sort(i+1, right);
}
int main()
{
int i;
length = 7;
arr_num[length] = {23, 7, 17, 36, 3, 61, 49}
//快速排序调用
quick_sort(0, length-1);
//输出排序后的结果
for(i=1;i<=length;i++)
printf("%d ",arr_num[i]);
getchar();getchar();
return 0;
}
Ⅶ c语言快速排序
俺博客里面有啦,参考自己写的,不好请指教:
http://hi..com/djpangxie/blog/item/572cc9d0ee5546da562c8414.html
Ⅷ C语言的快速排序的算法是什么啊
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法过程设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 一趟快速排序的算法是: 1)设置两个变量I、J,排序开始的时候:I=0,J=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0]; 3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值A[J],并与key交换; 4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的A[I],与key交换; 5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。) 例如:待排序的数组A的值分别是:(初始关键数据:X=49) 注意关键X永远不变,永远是和X进行比较,无论在什么位子,最后的目的就是把X放在中间,小的放前面大的放后面。 A[0] A[1] A[2] A[3] A[4] A[5] A[6]: 49 38 65 97 76 13 27 进行第一次交换后:27 38 65 97 76 13 49 ( 按照算法的第三步从后面开始找) 进行第二次交换后:27 38 49 97 76 13 65 ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时:I=3 ) 进行第三次交换后:27 38 13 97 76 49 65 ( 按照算法的第五步将又一次执行算法的第三步从后开始找 进行第四次交换后:27 38 13 49 76 97 65 ( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时:I=4,J=6 ) 此时再执行第三步的时候就发现I=J,从而结束一趟快速排序,那么经过一趟快速排序之后的结果是:27 38 13 49 76 97 65,即所有大于49的数全部在49的后面,所有小于49的数全部在49的前面。 快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示: 初始状态 {49 38 65 97 76 13 27} 进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65} 分别对前后两部分进行快速排序 {27 38 13} 经第三步和第四步交换后变成 {13 27 38} 完成排序。 {76 97 65} 经第三步和第四步交换后变成 {65 76 97} 完成排序。
Ⅸ C语言有简单,时间复杂度低,稳定的排序方法吗
有冒泡法选择法,但这两个时间复杂度不低。还有三张方法,这里有三种,你看看吧。
(3)“快速法”
快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:
void quick(int *a,int i,int j)
{
int m,n,temp;
int k;
m=i;
n=j;
k=a[(i+j)/2]; /*选取的参照*/
do {
while(a[m]<k&&m<j) m++; /* 从左到右找比k大的元素*/
while(a[n]>k&&n>i) n--; /* 从右到左找比k小的元素*/
if(m<=n) { /*若找到且满足条件,则交换*/
temp=a[m];
a[m]=a[n];
a[n]=temp;
m++;
n--;
}
}while(m<=n);
if(m<j) quick(a,m,j); /*运用递归*/
if(n>i) quick(a,i,n);
}
(4)“插入法”
插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。
void insert(int *a,int n)
{
int i,j,temp;
for(i=1;i<n;i++) {
temp=a[i]; /*temp为要插入的元素*/
j=i-1;
while(j>=0&&temp<a[j]) { /*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/
a[j+1]=a[j];
j--;
}
a[j+1]=temp; /*插入*/
}
}
(5)“shell法”
shell法是一个叫 shell 的美国人与1969年发明的。它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:
void shell(int *a,int n)
{
int i,j,k,x;
k=n/2; /*间距值*/
while(k>=1) {
for(i=k;i<n;i++) {
x=a[i];
j=i-k;
while(j>=0&&x<a[j]) {
a[j+k]=a[j];
j-=k;
}
a[j+k]=x;
}
k/=2; /*缩小间距值*/
}
}