快速排序(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;	  //当前长度
	int listsize;   //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList; 

void InitList_Sq(SqList &L){    // 构造一个空的线性表L。
    int i;
    L.r = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if (!L.r) exit(0); //存储分配失败
    L.length = 0;                              //空表长度为0
    L.listsize = LIST_INIT_SIZE;   //初始存储容量

    printf("请输入初始线性表长度:n="); //输入线性表初始化时的长度
    scanf("%d",&L.length);
    printf("请输入位序从1到%d的各元素(整数),例如:2 4 5 6 7 ...\n");
    for(i=0;i<L.length;i++)
		scanf("%d",&L.r[i]);    //输入线性表的各元素
}//InitList_Sq

Status FreeList_Sq(SqList &L){ // 构造一个空的线性表L。
    free(L.r);
    return 0;
}//FreeList_Sq

int Partition(SqList &L,int low,int high)
{
  int pivotkey = L.r[low];
  while(low<high)
  {
    if(low<high && L.r[high]>=pivotkey) --high;
    L.r[low]=L.r[high];
    if(low<high && L.r[low]<=pivotkey) ++low;
    L.r[high]=L.r[low];
   }
  L.r[low]=pivotkey;
  return low;
}

void ListDisplay_Sq(SqList L){
	//显示当前线性表所有元素
	int i;
	for(i=0;i<L.length;i++)
		printf("%3d",L.r[i]);
	printf("\n");
}//ListDisplay_Sq

void QSort(SqList &L,int low ,int high,int i)
{
	//对顺序表L中的子序列 r[low...high]做快速排序
	int pivotloc;

	if(low<high)
	{
		pivotloc=Partition(L,low,high);
		printf("第%d趟排序结果:",i++);
		ListDisplay_Sq(L);
		QSort(L,low,pivotloc-1,i);//对左子表 递归排序
		QSort(L,pivotloc+1,high,i);//对右子表 递归排序 

	}
}

main()
{
	SqList L;
	int i=1;
	InitList_Sq(L);
	int low=0;
	int high=L.length-1;
	QSort(L, low ,high,i);
	FreeList_Sq(L);
}
时间: 2024-12-18 02:30:36

快速排序(c语言)的相关文章

排序(5)---------快速排序(C语言实现)

继shell发明了shell排序过后呢,各位计算机界的大牛们又开始不爽了,为什么他能发明,我就不能发明呢.于是又有个哥们蹦出来了.哎...那么多排序,就木有一个排序是中国人发明的.顺便吐槽一下,一百年的天朝的历史书里还在吹,祖冲之第一个发现圆周率,领先世界一千多年...... 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 步骤为: 1,从数列中挑出一个元素,称为 "基准", 2,重新排序数列,所有元素比基准

经典排序算法之快速排序(C语言版)

快速排序是一种很常用的排序算法. /*  * 快速排序(伪算法) 2016-04-20 23:34:16  * 1.先找到第一个元素的最终位置  * 2.对第一个元素的最终位置之前的元素,进行快速排序.  * 3.对第一个元素的最终位置之后的元素,进行快速排序.  * */ extern void QuickSort(int a[],int low,int high);//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标 extern int FindPos(int a[], i

快速排序&gt;&gt;&gt;&gt;C语言实现

#include <stdio.h> #include <stdlib.h> #include <string.h> void swap(int *p1, int *p2) { int tmp = 0; tmp = *p1; *p1 = *p2; *p2 = tmp; } void quick_sort(int arr[], int len) { int i = 0; int j = 0; for (i = 0; i < len; i++) { for (j =

快速排序(C语言)

非递归: #include <stdio.h> #include <stdlib.h> int partition(int s[], int i, int j) { int value = 0; int flag = 1; //判断该从头循环还是尾循环 value = s[i]; while(i<j) { switch(flag) { case 0: if(s[i] < value) i++; else { s[j--] = s[i]; flag = 1; } brea

插入排序/希尔排序/快速排序C语言实现

#include<stdio.h> #include<stdlib.h> #include<string.h> void swap(int *a,int *b) { int tmp=*a; *a=*b; *b=tmp; } void insertSort(int *a,int n) { int tmp,i,j; for(i=1;i<n;i++) { tmp=a[i]; for(j=i;j>0&&tmp<a[j-1];j--)//find

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是稳定的排序 堆排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是不稳定的排序 1.快速排序 快速排序的介绍以及C语言实现在这里:快速排序C语言实现 本文介绍的是快速排序python实现: de

qsort快排c语言和c++应用

C语言中用qsort()快速排序 C语言中排序的算法有很多种,系统也提供了一个函数qsort()可以实现快速排序.原型如下: void qsort(void *base, size_t nmem, size_t size, int (*comp)(const void *, const void *)); 它根据comp所指向的函数所提供的顺序对base所指向的数组进行排序,nmem为参加排序的元素个数,size为每个元素所占的字节数.例如要对元素进行升序排列,则定义comp所指向的函数为:如果

快速排序(Quick Sort)的C语言实现

快速排序(Quick Sort)的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序,具体步骤为 设立枢轴,将比枢轴小的记录移到低端,比枢轴大的记录移到高端,直到low=high停止 分别对枢轴低高端部分再次快速排序(即重复第1步) 重复第1.2步,直到low=high停止 C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章,转载请注明来自钢铁侠Mac博客http:/

c语言最基础的冒泡排序和快速排序

学C语言刚学到数组,学到数组排序必不可少,这只是两种最基础的排序方法 以下排序是根据数字的从大到小排序 冒泡排序 快速排序

C语言快速排序算法代码分析

最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要.有的时候代码的可维护.可重用.可扩展确实胜过单纯的算法效率高.所以拾起大牛书籍<大话设计模式>同时参考网上诸大牛的博客,开始我的设计模式之旅.由于平时编程时用C/C++,现在是Java,也练练Java语法. 今天先介绍一下命令模式. 概念: 命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.