快速排序及C语言实现

快速排序算法最坏复杂度很差,相当于插入排序,但是平均性能很好,甚至大多数时候优于堆排序和归并排序,并且是一种内排序算法,因此在实际中往往用的最多。

快速排序的步骤:将数组a[p...r]划分为两个子数组a[p...q-1]和a[q+1...r],使得前者的每个元素小于等于a[q],后者的每个元素大于等于a[q]。然后再递归调用函数,对这两个子数组进行快速排序即可。

#include <stdio.h>

void quicksort(int *a,int p,int r);
int partition(int *a,int p,int r);
main()
{
	int a[12] = {2,8,23,7,1,3,5,34,64,6,32,4};
	int i;
	//printf("%d\n",partition(a,1,8));
	quicksort(a,1,12);
	for (i = 0;i < 12;i++)
		printf("%d  ",a[i]);
	printf("\n");
}
void quicksort(int *a,int p,int r)
{
	int q;//,partition(int *a,int p,int r);
	if (p < r) {
		q = partition(a,p,r);
		quicksort(a,p,q-1);
		quicksort(a,q+1,r);
	}
}
int partition(int *a,int p,int r)
{
	int x,i,j;
	int temp;
	x = a[r-1];
	i = p - 1;
	for (j = p-1;j < r-1;j++) {
		if (a[j] <= x) {
			temp = a[i];
			a[i] = a[j];
			a[j] = temp;
			i++;
		}
	}
	temp = a[i];
	a[i] = a[r-1];
	a[r-1] = temp;
	return i+1;
}
时间: 2024-07-30 18:16:05

快速排序及C语言实现的相关文章

快速排序算法-C语言实现

注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯彻. 以下内容翻译自: http://cprogramminglanguage.net/quicksort-algorithm-c-source-code.aspx 译文: 在快速排序算法中,使用了分治策略.首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束. 步骤如下: 在序列

快速排序(C语言)-解析

快速排序 快速排序是一种排序算法,对包含 n 个数的输入数组,最坏情况运行时间为O(n2).虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳的实用选择, 这是因为其平均性能相当好:期望的运行时间为O(nlgn),且O(nlgn)记号中隐含的常数因子很小.另外,它还能够进行就地排序,在虚存环境中也能很好的工作. 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,

快速排序算法C语言版

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过

算法学习之快速排序的C语言实现

近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/morewindows/article/details/6684558 于是我就模仿着谢了完整的代码,实现很好. 另外,为了 测量程序运行的时间,加了测试代码.好了,废话不多说. //快速排序实现 #include "stdio.h" #include "stdlib.h"

快速排序,C语言实现

排序法里比较出名的,具体的算法看下图: 这篇博客说的通俗易懂:http://blog.csdn.net/morewindows/article/details/6684558 这是快速排序的基础,用代码实现如下: void DiviedSort(int* arr_p,int start,int end) { int left,right,i=0; int pivot,result; bool flag; flag = TRUE; pivot = arr_p[start]; right = end

快速排序(c语言)

用顺序表保存输入的数据,再用快速排序法给输入的数据排序,并打印出每趟排序后的结果 #include<stdio.h> #include<stdlib.h> #include <conio.h> #define LIST_INIT_SIZE 100 typedef int Status; typedef int ElemType; typedef struct{ ElemType *r; //存储空间基址 // struct A *r int length; //当前长度

常用排序算法之——快速排序(C语言+VC6.0平台)

经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) //以key为基准 将待排数列“高”.“低 ”两部分,“高”部分的所有数据比key大,“低”部分的数据都比key小 { int left,right,key; left=low;right=high;key=num[low]; while(left<right) { while(left<right

快速排序的C语言实现

电脑配置不行,就只安装了个visual c++ 2010 express,按经典教材写了个快速排序,有点生疏,还不错. int Partition(int data[],int low,int high){ int pivotkey=data[low]; data[0]=data[low]; while(low<high) {  while(low<high&&data[high]>=pivotkey)   high--;  data[low]=data[high];  

快速排序的C语言实现

#include <stdio.h>//快速排序算法/*b是起始索引号m是终止索引号.快排的过程是:0.i=第一个元素位置索引号 j=最后一个元素的位置索引号 x等于第i个元素的值1.从位置j开始从右向左找比x小的值的索引号,这个过程就是每一次j都减小1直到找到为止.2.将比x小的值填入到i索引的位置.3.i自增1.4.5.从i*/void quickpatition(int a[],int b,int m){        }

快速排序法C语言实现

快速排序法是对冒泡排序法的一种改进.他的基本思想是通过一趟排序把数据分割成独立的两部分, 其中一部分的所有数据都比另一部分要小,以达到整个数据的排序. 首先选取一个数据为基准X通常选取第一个数据.设置两个变量I,J开始排序的时候I = 0 J = N-1(这里N为数据的个数).从J开始搜索,即从后往前搜索,找到小于X的值两者交换.,之后从I开始搜索,找到大于X的值交换两者,交叉重复以上两步,直到I = J: 举个例子: A[0]    A[1]    A[2]    A[3]    A[4]