C (++)内部排序汇总(快速排序&冒泡排序&堆排序&选择排序&插入排序&归并排序)

合集下载

快速排序算法c语言实验报告

快速排序算法c语言实验报告

快速排序算法c语言实验报告冒泡法和选择法排序C程序实验报告实验六:冒泡法排序物理学416班赵增月F12 2011412194日期:2013年10月31日一·实验目的 1.熟练掌握程序编写步骤;2.学习使用冒泡法和选择法排序;3.熟练掌握数组的定义和输入输出方法。

二·实验器材1.电子计算机;2.VC6.0三·实验内容与流程1.流程图(1)冒泡法(2)选择法 2.输入程序如下:(1)冒泡法#includestdio.h void main() { int a[10]; int i,j,t; printf(请输入10个数字:\n); for(i=0;i10;i++)scanf(%d,&a[i]); printf(\n); for(j=0;j9;j++)for(i=0;i9-j;i++) if(a[i]a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } printf(排序后如下:\n); for(i=0;i10;i++) printf(%d,a[i]); printf(\n); }(2)选择法#includestdio.h void main() { int a[10]; int i,j,t,k; printf(请输入10个数字:\n); for(i=0;i10;i++)scanf(%d,&a[i]);printf(\n); for(i=0;i9;i++) {k=i;for(j=i+1;j10;j++) if (a[k]a[j])k=j;t=a[i];a[i]=a[k];a[k]=t; }printf(排序后如下:\n); for(i=0;i10;i++)printf(%d,a[i]); printf(\n); }四.输出结果(1冒泡法)请输入10个数字:135****2468排序后如下:12345678910 (2)选择法输出结果请输入10个数字:135****6810排序后如下:12345678910五.实验反思与总结1.冒泡法和选择法是一种数组排序的方法,包含两层循环,写循环时,要注意循环变量的变化范围。

c快速排序题

c快速排序题

c快速排序题含解答共5道题目一:快速排序基本原理问题:简要解释快速排序的基本原理。

说明它是如何工作的。

解答:快速排序是一种基于分治思想的排序算法。

其基本原理如下:1. 分解:选择一个元素作为基准(通常选择数组的第一个元素),将数组分成两个子数组,小于基准的元素放在左边,大于基准的元素放在右边。

2. 递归:递归地对左右两个子数组进行排序。

3. 合并:已排序的子数组合并成最终的排序数组。

题目二:递归实现快速排序问题:使用递归的方式实现快速排序算法。

解答:```c#include <stdio.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;}int partition(int arr[], int low, int high) {int pivot = arr[low];int i = low + 1;int j = high;while (1) {while (i <= j && arr[i] <= pivot)i++;while (i <= j && arr[j] > pivot)j--;if (i <= j)swap(&arr[i], &arr[j]);elsebreak;}swap(&arr[low], &arr[j]);return j;}void quicksort(int arr[], int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quicksort(arr, low, pivot - 1);quicksort(arr, pivot + 1, high);}}int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr) / sizeof(arr[0]);printf("Unsorted array: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);quicksort(arr, 0, n - 1);printf("\nSorted array: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;}```题目三:非递归实现快速排序问题:使用非递归的方式实现快速排序算法。

c语言快速排序的库函数整理

c语言快速排序的库函数整理

c语⾔快速排序的库函数整理这些库函数都是在平时编程中经常调⽤的快排函数View Code以下所介绍的所有排序都是从⼩到⼤排序快速排序的库函数都包含在头⽂件名为<stdlib.h>中<1>对int型数组排序int num[100];int cmp(const void *a,const void *b){return *(int *)a-*(int *)b;}int main(){......qsort(num,100,sizeof(num[0]),cmp);return0;}<2>对char型数组排序char st[100];int cmp(const void *a,const void *b){return *(char *)a-*(char *)b;}int main(){......qsort(st,100,sizeof(st[0]),cmp);return0;}<3>对double型数组排序double f[100];int cmp(const void *a,const void *b){return ((*(double *)a-*(double *)b>0)?1:-1);}int main(){......qsort(f,100,sizeof(f[0]),cmp);return0;}<4>对结构体排序struct node{double data;int flag;}f[100];int cmp(const void *a,const void *b){return (((struct node *)a)->data>((struct node *)b)->data?1:-1);}int main(){......qsort(f,100,sizeof(f[0]),cmp);return0;}<5>对结构体的⼆级排序struct node{double data;int flag;}f[100];int cmp(const void *a,const void *b){if(((struct node *)a)->data != ((struct node *)b)->data)return (((struct node *)a)->data > ((struct node *)b)->data?1:-1);elsereturn (((struct node *)a)->flag-((struct node *)b)->flag);}int main(){......qsort(f,100,sizeof(f[0]),cmp);return0;}<6>对字符串数组的排序int st[100];int cmp(const void *a,const void *b){return strcmp((char *)a,(char *)b);//根据字典序进⾏⽐较排序}int main(){......qsort(st,100,sizeof(st[0]),cmp);return0;}<7>对指针数组的排序char *s[100];//定义⼀个指针的数组int cmp(const void *a,const void *b){return (strcmp(*(char**)a,*(char**)b));//这⾥⽤char**表⽰指针的指针}int main(){......qsort(s,100,sizeof(s[0]),cmp);return0;}。

C语言八大排序算法

C语言八大排序算法

C语⾔⼋⼤排序算法C语⾔⼋⼤排序算法,附动图和详细代码解释!来源:C语⾔与程序设计、⽵⾬听闲等⼀前⾔如果说各种编程语⾔是程序员的招式,那么数据结构和算法就相当于程序员的内功。

想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。

⼆⼋⼤排序算法排序算法作为数据结构的重要部分,系统地学习⼀下是很有必要的。

1、排序的概念排序是计算机内经常进⾏的⼀种操作,其⽬的是将⼀组“⽆序”的记录序列调整为“有序”的记录序列。

排序分为内部排序和外部排序。

若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。

反之,若参加排序的记录数量很⼤,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。

2、排序分类⼋⼤排序算法均属于内部排序。

如果按照策略来分类,⼤致可分为:交换排序、插⼊排序、选择排序、归并排序和基数排序。

如下图所⽰:3、算法分析1.插⼊排序*直接插⼊排序*希尔排序2.选择排序*简单选择排序*堆排序3.交换排序*冒泡排序*快速排序4.归并排序5.基数排序不稳定排序:简单选择排序,快速排序,希尔排序,堆排序稳定排序:冒泡排序,直接插⼊排序,归并排序,奇数排序1、插⼊排序将第⼀个和第⼆个元素排好序,然后将第3个元素插⼊到已经排好序的元素中,依次类推(插⼊排序最好的情况就是数组已经有序了)因为插⼊排序每次只能操作⼀个元素,效率低。

元素个数N,取奇数k=N/2,将下标差值为k的数分为⼀组(⼀组元素个数看总元素个数决定),在组内构成有序序列,再取k=k/2,将下标差值为k的数分为⼀组,构成有序序列,直到k=1,然后再进⾏直接插⼊排序。

3、简单选择排序选出最⼩的数和第⼀个数交换,再在剩余的数中⼜选择最⼩的和第⼆个数交换,依次类推4、堆排序以升序排序为例,利⽤⼩根堆的性质(堆顶元素最⼩)不断输出最⼩元素,直到堆中没有元素1.构建⼩根堆2.输出堆顶元素3.将堆低元素放⼀个到堆顶,再重新构造成⼩根堆,再输出堆顶元素,以此类推5、冒泡排序改进1:如果某次冒泡不存在数据交换,则说明已经排序好了,可以直接退出排序改进2:头尾进⾏冒泡,每次把最⼤的沉底,最⼩的浮上去,两边往中间靠16、快速排序选择⼀个基准元素,⽐基准元素⼩的放基准元素的前⾯,⽐基准元素⼤的放基准元素的后⾯,这种动作叫分区,每次分区都把⼀个数列分成了两部分,每次分区都使得⼀个数字有序,然后将基准元素前⾯部分和后⾯部分继续分区,⼀直分区直到分区的区间中只有⼀个元素的时候,⼀个元素的序列肯定是有序的嘛,所以最后⼀个升序的序列就完成啦。

CC++实现快速排序算法的思路及原理解析

CC++实现快速排序算法的思路及原理解析

CC++实现快速排序算法的思路及原理解析⽬录快速排序2. 实现原理3. 动态演⽰4. 完整代码5. 结果展⽰6. 算法分析快速排序1. 算法思想快速排序的基本思想:通过⼀趟排序将待排记录分隔成独⽴的两部分,其中⼀部分记录的关键字均⽐另⼀部分的关键字⼩,则可分别对这两部分记录继续进⾏排序,以达到整个序列有序。

2. 实现原理2.1、设置两个变量 low、high,排序开始时:low=0,high=size-1。

2.2、整个数组找基准正确位置,所有元素⽐基准值⼩的摆放在基准前⾯,所有元素⽐基准值⼤的摆在基准的后⾯默认数组的第⼀个数为基准数据,赋值给key,即key=array[low]。

因为默认数组的第⼀个数为基准,所以从后⾯开始向前搜索(high–),找到第⼀个⼩于key的array[high],就将 array[high] 赋给 array[low],即 array[low] = array[high]。

(循环条件是 array[high] >= key;结束时 array[high] < key)此时从前⾯开始向后搜索(low++),找到第⼀个⼤于key的array[low],就将 array[low] 赋给 array[high],即 array[high] = array[low]。

(循环条件是 array[low] <= key;结束时 array[low] > key)循环 2-3 步骤,直到 low=high,该位置就是基准位置。

把基准数据赋给当前位置。

2.3、第⼀趟找到的基准位置,作为下⼀趟的分界点。

2.4、递归调⽤(recursive)分界点前和分界点后的⼦数组排序,重复2.2、2.3、2.4的步骤。

2.5、最终就会得到排序好的数组。

3. 动态演⽰4. 完整代码三个函数基准插⼊函数:int getStandard(int array[],int low,int high)(返回基准位置下标)递归排序函数:void quickSort(int array[],int low,int high)主函数:int main()#include <stdio.h>#include <stdlib.h>void display(int* array, int size) {for (int i = 0; i < size; i++) {printf("%d ", array[i]);}printf("\n");}int getStandard(int array[], int i, int j) {// 基准数据int key = array[i];while (i < j) {// 因为默认基准是从左边开始,所以从右边开始⽐较// 当队尾的元素⼤于等于基准数据时,就⼀直向前挪动 j 指针while (i < j && array[j] >= key) {j--;}// 当找到⽐ array[i] ⼩的时,就把后⾯的值 array[j] 赋给它if (i < j) {array[i] = array[j];}// 当队⾸元素⼩于等于基准数据时,就⼀直向后挪动 i 指针while (i < j && array[i] <= key) {i++;}// 当找到⽐ array[j] ⼤的时,就把前⾯的值 array[i] 赋给它if (i < j) {array[j] = array[i];}}// 跳出循环时 i 和 j 相等,此时的 i 或 j 就是 key 的正确索引位置// 把基准数据赋给正确位置array[i] = key;return i;}void QuickSort(int array[], int low, int high) {// 开始默认基准为 lowif (low < high) {// 分段位置下标int standard = getStandard(array, low, high);// 递归调⽤排序// 左边排序QuickSort(array, low, standard - 1);// 右边排序QuickSort(array, standard + 1, high);}}// 合并到⼀起快速排序// void QuickSort(int array[], int low, int high) {// if (low < high) {// int i = low;// int j = high;// int key = array[i];// while (i < j) {// while (i < j && array[j] >= key) {// j--;// }// if (i < j) {// array[i] = array[j];// }// while (i < j && array[i] <= key) {// i++;// }// if (i < j) {// array[j] = array[i];// }// }// array[i] = key;// QuickSort(array, low, i - 1);// QuickSort(array, i + 1, high);// }// }int main() {int array[] = {49, 38, 65, 97, 76, 13, 27, 49, 10};int size = sizeof(array) / sizeof(int);// 打印数据printf("%d \n", size);QuickSort(array, 0, size - 1);display(array, size);// int size = 20;// int array[20] = {0}; // 数组初始化// for (int i = 0; i < 10; i++) { // 数组个数// for (int j = 0; j < size; j++) { // 数组⼤⼩// array[j] = rand() % 1000; // 随机⽣成数⼤⼩ 0~999// }// printf("原来的数组:");// display(array, size);// QuickSort(array, 0, size - 1);// printf("排序后数组:");// display(array, size);// printf("\n");// }return 0;}5. 结果展⽰(递归调⽤,不好展⽰每次排序结果)6. 算法分析时间复杂度:最好: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2n)最坏: O ( n 2 ) O(n^2) O(n2)平均: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2n)空间复杂度: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2n)稳定性:不稳定到此这篇关于C/C++实现快速排序算法的思路及原理解析的⽂章就介绍到这了,更多相关C++实现快速排序算法内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

数据结构(C语言版)实验报告 (内部排序算法比较)

数据结构(C语言版)实验报告 (内部排序算法比较)

《数据结构与算法》实验报告一、需求分析问题描述:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。

试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。

基本要求:(l)对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

(2)待排序表的表长不小于100000;其中的数据要用伪随机数程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)。

(3)最后要对结果作简单分析,包括对各组数据得出结果波动大小的解释。

数据测试:二.概要设计1.程序所需的抽象数据类型的定义:typedef int BOOL; //说明BOOL是int的别名typedef struct StudentData { int num; //存放关键字}Data; typedef struct LinkList { int Length; //数组长度Data Record[MAXSIZE]; //用数组存放所有的随机数} LinkList int RandArray[MAXSIZE]; //定义长度为MAXSIZE的随机数组void RandomNum() //随机生成函数void InitLinkList(LinkList* L) //初始化链表BOOL LT(int i, int j,int* CmpNum) //比较i和j 的大小void Display(LinkList* L) //显示输出函数void ShellSort(LinkList* L, int dlta[], int t,int* CmpNum, int* ChgNum) //希尔排序void QuickSort (LinkList* L, int* CmpNum, int* ChgNum) //快速排序void HeapSort (LinkList* L, int* CmpNum, int* ChgNum) //堆排序void BubbleSort(LinkList* L, int* CmpNum, int* ChgNum) //冒泡排序void SelSort(LinkList* L, int* CmpNum, int* ChgNum) //选择排序void Compare(LinkList* L,int* CmpNum, int* ChgNum) //比较所有排序2 .各程序模块之间的层次(调用)关系:二、详细设计typedef int BOOL; //定义标识符关键字BOOL别名为int typedef struct StudentData //记录数据类型{int num; //定义关键字类型}Data; //排序的记录数据类型定义typedef struct LinkList //记录线性表{int Length; //定义表长Data Record[MAXSIZE]; //表长记录最大值}LinkList; //排序的记录线性表类型定义int RandArray[MAXSIZE]; //定义随机数组类型及最大值/******************随机生成函数********************/void RandomNum(){int i; srand((int)time(NULL)); //用伪随机数程序产生伪随机数for(i=0; i小于MAXSIZE; i++) RandArray[i]<=(int)rand(); 返回;}/*****************初始化链表**********************/void InitLinkList(LinkList* L) //初始化链表{int i;memset(L,0,sizeof(LinkList));RandomNum();for(i=0; i小于<MAXSIZE; i++)L->Record[i].num<=RandArray[i]; L->Length<=i;}BOOL LT(int i, int j,int* CmpNum){(*CmpNum)++; 若i<j) 则返回TRUE; 否则返回FALSE;}void Display(LinkList* L){FILE* f; //定义一个文件指针f int i;若打开文件的指令不为空则//通过文件指针f打开文件为条件判断{ //是否应该打开文件输出“can't open file”;exit(0); }for (i=0; i小于L->Length; i++)fprintf(f,"%d\n",L->Record[i].num);通过文件指针f关闭文件;三、调试分析1.调试过程中遇到的问题及经验体会:在本次程序的编写和调试过程中,我曾多次修改代码,并根据调试显示的界面一次次调整代码。

c语言快排算法

c语言快排算法

c语言快排算法快速排序是一种高效的排序算法,它的思想是通过分治法将一个大问题分解成若干个小问题,然后逐步解决这些小问题,最终得到整个问题的解决方案。

它的核心是选取一个支点,将序列分成左右两个子序列,左边的序列都比支点小,右边的序列都比支点大,然后再对左右两个子序列分别进行递归排序,最后将左右两个排好序的子序列合并成一个有序序列。

在C语言中,快速排序可以通过以下代码来实现:void quick_sort(int arr[], int left, int right){if(left < right){int i = left, j = right, pivot = arr[left];while(i < j){while(i < j && arr[j] >= pivot) j--;if(i < j) arr[i++] = arr[j];while(i < j && arr[i] < pivot) i++;if(i < j) arr[j--] = arr[i];}arr[i] = pivot;quick_sort(arr, left, i - 1);quick_sort(arr, i + 1, right);}}在这段代码中,left和right分别代表数组的左右边界,arr是待排序的数组。

首先选择arr[left]作为支点,然后使用两个指针i 和j分别从左右两端扫描数组,将比支点大的数移到右边,比支点小的数移到左边,直到i和j相遇。

最后将支点放到i的位置,再对左右两个子序列分别进行递归排序即可。

快速排序的时间复杂度为O(n*logn),它的空间复杂度为O(logn)。

由于它的快速性和不需要额外空间的特点,使得它在实际应用中得到了广泛应用。

c语言几种数组排序方法

c语言几种数组排序方法

常用的c语言排序算法主要有三种即冒泡法排序、选择法排序、插入法排序。

一、冒泡排序冒泡排序:是从第一个数开始,依次往后比较,在满足判断条件下进行交换。

代码实现(以降序排序为例)#include<stdio.h>int main(){int array[10] = { 6,9,7,8,5,3,4,0,1,2 };int temp;for (int i = 0; i < 10; i++){//循环次数for (int j = 0; j <10 - i-1; j++){if (array[j] < array[j+1]){//前面一个数比后面的数大时发生交换temp = array[j];array[j] = array[j+1];array[j + 1] = temp;}}} //打印数组for (int i = 0; i < 10; i++) printf("%2d", array[i]); return 0;}}二、选择排序以升序排序为例:就是在指定下标的数组元素往后(指定下标的元素往往是从第一个元素开始,然后依次往后),找出除指定下标元素外的值与指定元素进行对比,满足条件就进行交换。

与冒泡排序的区别可以理解为冒泡排序是相邻的两个值对比,而选择排序是遍历数组,找出数组元素与指定的数组元素进行对比。

(以升序为例)#include<stdio.h>int main(){int array[10] = { 6,9,7,8,5,3,4,0,1,2 };int temp, index;for (int i = 0; i < 9; i++) {index = i;for (int j = i; j < 10; j++){if (array[j] < array[index])index = j;}if(i != index){temp = array[i]; array[i] = array[index]; array[index] = temp; }for(int i=0;i<10:i++) printf("%2d"array[i])return 0;}三、快速排序是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

C语言常见排序算法

C语言常见排序算法
Gap的取法有多种。 shell 提出取 gap = n/2,gap = gap/2, 直到gap = 1。
6.1.5 选择排序
排序过程:
首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数 交换—第一趟选择排序,结果最小的数被安置在第一个元素位 置上 再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录, 将它与第二个数交换—第二趟选择排序 重复上述过程,共经过n-1趟排序后,排序结束
6.1.3 直接插入排序
实用例子:
已知待序的一组记录的初始排列为:21, 25, 49, 25*, 16, 08
21 25 49 25* 16 08 012345
6.1.3 直接插入排序
实用例子:
i=1
21 25 49 25* 16 08 25 012345 temp
i=2 i=3
21 25 49 25* 16 08 49 012345 temp
6.1.1Leabharlann 冒泡排序算法实例21
21
21
21
16
08
25
25
25
16
08
16
49
25
16
08
21
21
25
16
08
25
25
25
16
08
25
25
25
25
08
49
49
49
49
49
6.1.1 冒泡排序
算法实现
输入n 个数给a[1] 到 a[n] for j=1 to n-1
for i=1 to n-j

if ( temp < r[j-1] ) r[j] = r[j-1];

c语言排列组合代码

c语言排列组合代码

c语言排列组合代码C语言排列组合是编程中非常重要的一个概念,它可以帮助我们解决很多实际问题。

下面我将为你介绍一些关于C语言排列组合的基本知识,并提供一些示例代码帮助你更好地理解。

首先,我们需要了解排列和组合这两个概念的区别。

排列指的是从一组元素中选取一部分进行排列放置,而组合则是从一组元素中选取一部分进行组合放置。

换句话说,排列要考虑元素的顺序,而组合则不考虑元素的顺序。

那么,如何实现C语言中的排列组合呢?一、排列1.全排列全排列是指将给定的一组元素进行全面的排列,即将每个元素都当作一个起始元素,与其他元素进行交换得到所有可能的排列。

以下是一个示例代码:```#include <stdio.h>// 交换两个元素的值void swap(char *a, char *b) {char temp = *a;*a = *b;*b = temp;}// 输出全排列结果void permute(char *str, int start, int end) {if (start == end) {printf("%s\n", str);} else {for (int i = start; i <= end; i++) {swap((str + start), (str + i));permute(str, start + 1, end);swap((str + start), (str + i)); // 恢复原始位置 }}}int main() {char str[] = "abc";int size = strlen(str);permute(str, 0, size - 1);return 0;}```2.部分排列部分排列是指从一组元素中选取一部分进行排列。

以下是一个示例代码:```#include <stdio.h>// 输出部分排列结果void partial_permute(char *str, int start, int end, int r) {if (r == 0) {for (int i = 0; i < start; i++) {printf("%c", str[i]);}printf("\n");} else {for (int i = start; i <= end; i++) {swap((str + start), (str + i));partial_permute(str, start + 1, end, r - 1);swap((str + start), (str + i)); // 恢复原始位置}}}int main() {char str[] = "abcd";int size = strlen(str);int r = 3; // 选取3个元素进行排列partial_permute(str, 0, size - 1, r);return 0;}```二、组合组合是指从一组元素中选取一部分进行组合。

c语言各种排序法详解

c语言各种排序法详解

一插入排序1.1 直接插入排序基本思想:每次将一个待排序额记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序。

图解:代码实现:[cpp]view plaincopy1.//直接顺序排序2.void InsertSort(int r[],int n)3.{4.for(int i=2;i<n;i++)5.{6.r[0]=r[i];//设置哨兵7.for(int j=i-1;r[0]<r[j];j--)//寻找插入位置8.r[j+1]=r[j];//记录后移9.r[j+1]=r[0];10.}11.for(int k=1;k<n;k++)12.cout<<r[k]<<"";13.cout<<"\n";14.}1.2 希尔排序基本思想是:先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。

图解:代码实现:[cpp]view plaincopy1.<spanstyle="font-size:14px;">//希尔排序2.void ShellSort(int r[],int n)3.{4.int i;5.int d;6.int j;7.for(d=n/2;d>=1;d=d/2)//以增量为d进行直接插入排序8.{9.for(i=d+1;i<n;i++)10.{11.r[0]=r[i];//暂存被插入记录12.for(j=i-d;j>0&&r[0]<r[j];j=j-d)13.r[j+d]=r[j];//记录后移d个位置14.r[j+d]=r[0];15.}16.}17.for(i=1;i<n;i++)18.cout<<r[i]<<"";19.cout<<"\n";20.}</span>二交换排序2.1 起泡排序起泡排序是交换排序中最简单的排序方法,其基本思想是:两两比较相邻记录的关键码,如果反序则交换,直到没有反序的记录为止。

c语言排序与查找代码

c语言排序与查找代码

c语言排序与查找代码在程序设计中,排序和查找是非常常见的操作。

排序是将一组数据按照特定规则进行重新排列的过程,而查找则是在已经排列好的数据中寻找某个特定的元素。

C语言提供了丰富的函数和算法来实现这两个操作。

一、排序代码实现:C语言中有多种排序算法可以选择,其中最常见和经典的有冒泡排序、选择排序、插入排序和快速排序等。

1. 冒泡排序代码实现:冒泡排序是一种简单直观的排序算法,它通过不断交换相邻元素的位置,将较大的元素逐渐往后移动。

具体实现代码如下:```cvoid bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}```2. 选择排序代码实现:选择排序是一种简单的排序算法,它每次从待排序的数据中选出最小(或最大)的元素,放到已排序序列的末尾。

具体实现代码如下:```cvoid selectionSort(int arr[], int n) {int i, j, minIndex, temp;for (i = 0; i < n - 1; i++) {minIndex = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}```3. 插入排序代码实现:插入排序是一种简单直观的排序算法,它将待排序的数据分为已排序和未排序两部分,每次从未排序部分取出一个元素插入到已排序部分的适当位置。

内部排序C程序

内部排序C程序

1.简单插入排序截图:2.折半插入排序截图:3.快速排序截图:4.直接选择排序截图:5.堆排序截图:源程序清单如下:/*类型的定义*/#define MAXSIZE 20#define LT(a,b) ((a)<(b))#include <stdio.h>#include <conio.h>typedef int KeyType;typedef int InfoType;typedef struct{KeyType key;InfoType otherinfo;}RedType;typedef struct{RedType r[MAXSIZE+1];int length;}SqList;void InsertSort(SqList *L){ /*简单插入排序*/ int i,j;for(i=2;i<=L->length;++i){if(LT(L->r[i].key,L->r[i-1].key)){L->r[0]=L->r[i];for(j=i-1;LT(L->r[0].key,L->r[j].key);j--){L->r[j+1]=L->r[j];}L->r[j+1]=L->r[0];}}}void BInsertSort(SqList *L){ /*折半插入排序*/int i,j;int low,high,m;for(i=2;i<=L->length;++i){L->r[0]=L->r[i]; /*将R[i]暂存到R[0]*/low=1;high=i-1;while(low<=high){ /*在R[low..high]中折半查找插入的位置*/ m=(low+high)/2;if(LT(L->r[0].key,L->r[m].key)){high=m-1; /*插入点在低半区*/}else{low=m+1; /*插入点在高半区*/}}for(j=i-1;j>=high+1;--j){ /*记录后移*/L->r[j+1]=L->r[j];}L->r[high+1]=L->r[0]; /*插入*/}}int Partition(SqList *L,int low,int high){ /*快速排序*/int pivotkey;L->r[0]=L->r[low]; /*用子表的第一个记录作枢轴记录*/pivotkey=L->r[low].key; /*枢轴记录关键字*/while(low<high){while(low<high&&L->r[high].key>=pivotkey){--high;}L->r[low]=L->r[high]; /*将比枢轴记录小的记录移到低端*/while(low<high&&L->r[low].key<=pivotkey){++low;}L->r[high]=L->r[low]; /*将比枢轴记录大的记录移到高端*/ }L->r[low]=L->r[0];return low;}void QSort(SqList *L,int low,int high){int pivotloc;if(low<high){pivotloc=Partition(L,low,high); /*将L.r[low..high]一分为二*/QSort(L,low,pivotloc-1); /*对低子表递归排序,pivotloc是枢轴位置*/QSort(L,pivotloc+1,high); /*对高子表递归排序*/}}void QuickSort(SqList *L){ /*对记录序列进行快速排序*/ QSort(L,1,L->length);}int SelectMinKey(SqList L,int i){ /*简单选择排序*/int k;int j;k=i;for(j=i;j<L.length+1;j++){if(L.r[k].key>L.r[j].key){k=j;}}return k;}void SelectSort(SqList *L){ /*简单选择排序*/RedType t;int i,j;for(i=1;i<L->length;++i){ /*选择第i小的记录,并交换到位*/j=SelectMinKey(*L,i); /*在R[i..n]中选择key最小的记录*/if(i!=j){t=L->r[i];L->r[i]=L->r[j];L->r[j]=t;} /*与第i个记录交换*/}}typedef SqList HeapType;void HeapAdjust(HeapType *H,int s,int m){ /*堆排序*/RedType rc;int j;rc=H->r[s];for(j=2*s;j<=m;j*=2){ /*沿key较大的孩子结点向下筛选*/if(j<m&&LT(H->r[j].key,H->r[j+1].key)){++j; /*j为key较大的记录的下标*/}if(!LT(rc.key,H->r[j].key)){break; /*rc应插入在位置s上*/}H->r[s]=H->r[j];s=j;}H->r[s]=rc; /*插入*/}void HeapSort(HeapType *H){RedType t;int i;for(i=H->length/2;i>0;--i){ /*把R[1..n]建成大顶堆*/HeapAdjust(H,i,H->length);}for(i=H->length;i>1;--i){/*将堆顶记录和当前未经排序子序列R[1..i]中最后一个记录相互交换*/t=H->r[1];H->r[1]=H->r[i];H->r[i]=t;HeapAdjust(H,1,i-1); /*将R[1..i-1]重新调整为大顶堆*/}}void main(){int i,k,num;SqList s;printf("请输入待排序序列的个数:\n");scanf("%d",&num);printf("请输入序列中的元素:\n");for(i=1;i<=num;i++){scanf("%d",&s.r[i].key);}s.length=i-1;printf("\n\t1,简单插入排序\n\t2,折半插入排序\n\t3,快速排序\n\t4,直接选择排序\n");printf("\t5,堆排序\n\t按1,5选择操作\n");scanf("%d",&k);switch(k){case 1: InsertSort(&s);break;case 2: BInsertSort(&s);break;case 3: QuickSort(&s);break;case 4: SelectSort(&s);break;case 5: HeapSort(&s);break;default: printf("您没有选择一个操作。

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

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

快速排序(C语⾔)-解析快速排序快速排序是⼀种排序算法,对包含 n 个数的输⼊数组,最坏情况运⾏时间为O(n2)。

虽然这个最坏情况运⾏时间⽐较差,但快速排序通常是⽤于排序的最佳的实⽤选择,这是因为其平均性能相当好:期望的运⾏时间为O(nlgn),且O(nlgn)记号中隐含的常数因⼦很⼩。

另外,它还能够进⾏就地排序,在虚存环境中也能很好的⼯作。

快速排序(Quicksort)是对的⼀种改进。

快速排序由C. A. R. Hoare在1962年提出。

它的基本思想是:通过⼀趟排序将要排序的数据分割成独⽴的两部分,其中⼀部分的所有数据都⽐另外⼀部分的所有数据都要⼩,然后再按此⽅法对这两部分数据分别进⾏快速排序,整个排序过程可以进⾏,以此达到整个数据变成有序。

像合并排序⼀样,快速排序也是采⽤分治模式的。

下⾯是对⼀个典型数组A[p……r]排序的分治过程的三个步骤:分解:数组 A[p……r]被划分为两个(可能空)⼦数组 A[p……q-1] 和 A[q+1……r] ,使得 A[p……q-1] 中的每个元素都⼩于等于 A(q) , ⽽且,⼩于等于 A[q+1……r] 中的元素。

⼩标q也在这个划分过程中进⾏计算。

解决:通过递归调⽤快速排序,对于数组 A[p……q-1] 和 A[q+1……r] 排序。

合并:因为两个⼦数组是就地排序的,将它们的合并不需要操作:整个数组 A[p……r] 已排序。

下⾯的过程实现快速排序(伪代码):QUICK SORT(A,p,r)1if p<r2 then q<-PARTITION(A,p,r)3 QUICKSORT(A,p,q-1)4 QUICKSORT(A,q+1,r)为排序⼀个完整的数组A,最初的调⽤是QUICKSORT(A,1,length[A])。

数组划分: 快速排序算法的关键是PARTITION过程,它对⼦数组 A[p……r]进⾏就地重排(伪代码):PARTITION(A,p,r)1 x <- A[r]2 i <- p-13for j <- p to r-14do if A[j]<=x5 then i <- i+16 exchange A[i] <-> A[j]7 exchange A[i + 1] <-> A[j]8return i+1排序演⽰⽰例假设⽤户输⼊了如下数组:下标012345数据627389创建变量i=0(指向第⼀个数据), j=5(指向最后⼀个数据), k=6(为第⼀个数据的值)。

数据结构(C语言)第八章 排序

数据结构(C语言)第八章 排序

直接插入排序过程
0 21 1 25 2 49 3 4 25* 16 5 08 temp
i=1
0 21
21
1 25
25 25
2 49
49 49
3 4 25* 16
25* 16 25* 16
5 08
08 08
temp 25
i=2
21
49
21
25
25 25
49
49 25*
25* 16
25* 16 49 16
希尔排序 (Shell Sort)

基本思想设待排序对象序列有 n 个对象, 首 先取一个整数 gap < n 作为间隔, 将全部对 象分为 gap 个子序列, 所有距离为 gap 的对 象放在同一个子序列中, 在每一个子序列中 分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = gap/2,重复上述的子序列划 分和排序工作。直到最后取 gap == 1, 将所 有对象放在同一个序列中排序为止。 希尔排序方法又称为缩小增量排序。
第八章 排序
概述
插入排序
交换排序 选择排序 归并排序 基数排序 各种内排方法比较
概 述

排序: 将一个数据元素的任意序列,重新
排列成一个按关键字有序的序列。

数据表(datalist): 它是待排序数据对象的
有限集合。

主关键字(key): 数据对象有多个属性域,
即多个数据成员组成, 其中有一个属性域可用 来区分对象, 作为排序依据,称为关键字。也 称为关键字。
直接插入排序 (Insert Sort)

基本思想 当插入第i (i 1) 个对象时, 前面的 R[0], R[1], …, R[i-1]已经排好序。这时, 用 R[i]的关键字与R[i-1], R[i-2], …的关键字顺 序进行比较, 找到插入位臵即将R[i]插入, 原 来位臵上的对象向后顺移。

c最快排序方法

c最快排序方法

c最快排序方法
以下是C语言中几种常见的排序方法及其时间复杂度:
1. 冒泡排序:时间复杂度为O(n^2),是一种稳定的排序算法。

2. 快速排序:时间复杂度在最坏情况下为O(n^2),平均情况下为
O(nlogn),是一种不稳定的排序算法。

3. 归并排序:时间复杂度为O(nlogn),是一种稳定的排序算法。

4. 堆排序:时间复杂度为O(nlogn),是一种不稳定的排序算法。

5. 插入排序:时间复杂度为O(n^2),是一种稳定的排序算法。

请注意,以上时间复杂度只是理论上的,实际应用中,排序算法的效率还会受到其他因素的影响,如数据分布、内存使用等因素。

因此,在实际应用中,需要根据具体情况选择合适的排序算法。

严蔚敏版《数据结构(C语言版)》-内部排序-第10章

严蔚敏版《数据结构(C语言版)》-内部排序-第10章
>R[mid].key) )
high=mid-1 ; else low=mid+1 ;
}
/* 查找插入位置 */
for (j=i-1; j>=high+1; j--)
L->R[j+1]=L->R[j];
L->R[high+1]=L->R[0]; /* 插入到相
应位置 */
}
}
从时间上比较,折半插入排序仅仅减少了关键字的 比较次数,却没有减少记录的移动次数,故时间复杂度 仍然为O(n2) 。
待排序的记录类型的定义如下:
#define MAX_SIZE 100
Typedef int KeyType ;
typedef struct RecType
{ KeyType key ;
/* 关键字码 */
infoType otherinfo ; /* 其他域 */
}RecType ;
typedef struct Sqlist
③ 记录存储在一组连续地址的存储空间:构造另一 个辅助表来保存各个记录的存放地址(指针) :排序 过程不需要移动记录,而仅需修改辅助表中的指针, 排序后视具体情况决定是否调整记录的存储位置。
①比较适合记录数较少的情况;而②、③则适合 记录数较少的情况。
为讨论方便,假设待排序的记录是以①的情况存 储,且设排序是按升序排列的;关键字是一些可直接用 比较运算符进行比较的类型。
(n-1)(n+1)
2
移动次数:∑n (i+1)=
i=2
(n-1)(n+4)
2
一般地,认为待排序的记录可能出现的各种排列的
概率相同,则取以上两种情况的平均值,作为排序的关

C语言最常用的六种排序方法详解

C语言最常用的六种排序方法详解

1.冒泡排序:
2.简单选择排序:
3.快速排序:
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

4.直接插入排序:
5.折半插入排序:
折半插入排序(binary insertion sort)是对插入排序算法的一种改进,在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为
a[high],则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择a[m+1]到a[high]为新的插入区域(即low=m+1),如此直至low<=high不成立,即将此位置之后所有元素后移一位,并将新元素插入a[high+1]。

代码:
6.希尔排序:。

常用的内部排序方法

常用的内部排序方法

常用的内部排序方法有:交换排序(冒泡排序、快速排序)、选择排序(简单选择排序、堆排序)、插入排序(直接插入排序、希尔排序)、归并排序、基数排序(一关键字、多关键字)。

一、冒泡排序:1.基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。

2.排序过程:设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

【示例】:49 13 13 13 13 13 13 1338 49 27 27 27 27 27 2765 38 49 38 38 38 38 3897 65 38 49 49 49 49 4976 97 65 49 49 49 49 4913 76 97 65 65 65 65 6527 27 76 97 76 76 76 7649 49 49 76 97 97 97 97二、快速排序(Quick Sort)1.基本思想:在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X 则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。

2.排序过程:【示例】:初始关键字[49 38 65 97 76 13 27 49]第一次交换后[27 38 65 97 76 13 49 49]第二次交换后[27 38 49 97 76 13 65 49]J向左扫描,位置不变,第三次交换后[27 38 13 97 76 49 65 49]I向右扫描,位置不变,第四次交换后[27 38 13 49 76 97 65 49]J向左扫描[27 38 13 49 76 97 65 49](一次划分过程)初始关键字[49 38 65 97 76 13 27 49]一趟排序之后[27 38 13]49 [76 97 65 49]二趟排序之后[13]27 [38]49 [49 65]76 [97]三趟排序之后13 27 38 49 49 [65]76 97最后的排序结果13 27 38 49 49 65 76 97三、简单选择排序1.基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

c++快速排序详解

c++快速排序详解

c++快速排序详解c++快速排序详解快速排序,实际中最常用的一种排序算法,速度快,效率高,下面是店铺分享的c++快速排序详解,一起来看一下吧。

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分所有数据要小,然后再按此方法对这两部分数据分别进行快速排序。

整个排序过程可以递归进行,以此达到整个数据变成有序序列。

将数列变成上述形式,这一步很关键,做好这一步,才能对主元左右的`部分进行递归调用。

以下是实现这一部分的代码:int partition_sort(int arr[],int l,int r)//l是数组最左边,r为最右边{int j=l;//设计标记int t=arr[l];//设置主元for(int i=l+1;i<=r;i++){if(arr[i]<t){swap(arr[j+1],arr[i]);j++;}}swap(arr[l],arr[j]);return j;}上述代码中,我把最左边的元素当作主元,这样的代码对大多数排序都很高效,但是不排除个别情况(当数组近乎有序或者当数组内有大量重复元素),这时,我们的排序算法相比于归并排序显得并不是那么高效,这和我们的排序算法原理密不可分,细细分析,当数组近乎有序时,我们的快速排序竟然退化到了O(n^2)级别,这显然是非常不高效的。

要想实现上述不足的优化,我们可以将主元随机选择,或者采用其他方式的快速排序(双路快速排序,三路快速排序),本篇内容仅作为学习快排的基本思想和基本实现,不深入涉及,有兴趣的读者可查阅资料了解。

下面是全部的实现代码:#include <iostream>#include <math.h>using namespace std;//实现函数,用于partition的递归int partition_sort(int arr[],int l,int r)//l是数组最左边,r为最右边{int j=l;//设计标记int t=arr[l];//设置主元for(int i=l+1;i<=r;i++){if(arr[i]<t){swap(arr[j+1],arr[i]);j++;}}swap(arr[l],arr[j]);return j;}//实现递归的调用函数void partition(int arr[],int l,int r){if(l>=r)return ;int p=partition_sort(arr,l,r); partition(arr,l,p-1); partition(arr,p+1,r);}int main(){int a[5];for(int i=0;i<5;i++){cin>>a[i];}partition(a,0,4);for(int i=0;i<5;i++){cout<<a[i]<<" ";}return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>#define M 30001random(int a[30001]){int i;for(i=1;i<30001;i++)a[i]=rand()%30001;}//随机生成30000个数函数int change1(char a[81]){int b=0,n,i;for(i=0;a[i]!=0;i++);n=i-1;for(;i>1;i--)b+=((int)pow(10,n+1-i))*(a[i-1]-48);if(a[0]=='-')b=b*(-1);elseb+=((int)pow(10,n))*(a[0]-48);return b;}//字符转化成整型insort(int a[30001]){int i,j,temp,temp1,n;int count=0;n=30001;for(i=1;i<n;i++){temp=a[i];//for(j=i-1;j>=0;j--)/* 每次循环完毕数组的0到i-1项为一个有序的序列*/{count=0;/*这里count是标记位,可以减少比较次数*/if(a[j]>temp){temp1=a[j+1];a[j+1]=a[j];a[j]=temp1;count++;}//满足条件,前移if(count==0)break;//位置恰当,退出}}}//insort插入排序函数selsort(int a[30001]){int i,j,temp;for(i=1;i<30000;i++)for(j=i+1;j<30001;j++)if(a[i]>a[j]){temp=a[j];a[j]=a[i];a[i]=temp;}}//选择排序bubsort(int a[30001]){int i,j,temp;for(i=1;i<30001;i++)for(j=30000;j>i;j--){if(a[j-1]>a[j]){temp=a[j-1];a[j-1]=a[j];a[j]=temp;}}}//冒泡排序int partition(int a[30001],int low,int high){int pr;a[0]=a[low];pr=a[low];while(low<high){while(low<high&&a[high]>=pr) --high;a[low]=a[high];while(low<high&&a[low]<=pr) ++low;a[high]=a[low];}a[low]=a[0];return low;}//partionqsort(int a[30001],int low,int high) {int pr;if(low<high){pr=partition(a,low,high);qsort(a,low,pr-1);qsort(a,pr+1,high);}}//qsortquicksort(int a[30001]){//快速排序qsort(a,1,30000);}//quicksortvoid heapadjust(int a[M],int s,int m) {//建立堆函数int rc,j;rc=a[s];for(j=2*s;j<=m;j*=2){if(j<m&&a[j]<a[j+1])++j;if(rc>=a[j])break;a[s]=a[j];s=j;}a[s]=rc;}//heapadjust建立堆函数void heapsort(int a[30001]){int i,temp;for(i=M/2;i>0;--i)heapadjust(a,i,M);//建初始大顶堆for(i=M;i>1;--i){temp=a[i];a[i]=a[1];a[1]=temp;//交换,把最后一个记录和堆顶记录交换,最值移到最后heapadjust(a,1,i-1);//建立顶堆}}//heapadjust堆排序merge(int array[],int p,int q,int r){int i,k=0,begin1=p,end1=q,begin2=q+1,end2=r,*temp;temp=(int *)malloc((r-p+1)*sizeof(int));while((begin1<=end1)&&(begin2<=end2)){if(array[begin1]<array[begin2]){temp[k] = array[begin1]; begin1++;}else{temp[k] = array[begin2]; begin2++;}k++;}while(begin1<=end1){temp[k++] = array[begin1++];}while(begin2<=end2){temp[k++] = array[begin2++];}for (i = 0; i < (r - p +1); i++)array[p+i] = temp[i];free(temp);}//mergevoid mergesort(int array[], unsigned int first, unsigned int last) {int mid = 0;if(first<last){mid = (first+last)/2;mergesort(array, first, mid);mergesort(array, mid+1,last);merge(array,first,mid,last);}}//mergesort归并排序work1(char timep[2][30]){int A,a,B,b,margin;char newmin[3],newsec[3],oldmin[3],oldsec[3];newmin[0]=timep[0][14];newmin[1]=timep[0][15];newsec[0]=timep[0][17];newsec[1]=timep[0][18];oldmin[0]=timep[1][14];oldmin[1]=timep[1][15];oldsec[0]=timep[1][17];oldsec[1]=timep[1][18];newmin[2]=0;newsec[2]=0;oldmin[2]=0;oldsec[2]=0;A=change1(newmin);a=change1(newsec);B=change1(oldmin);b=change1(oldsec);margin=(B-A)*60+b-a;return margin;}//计算时间差void mark(char timep[30]){time_t timep1;int i;time(&timep1);for(i=0;ctime(&timep1)[i]!=0;i++)timep[i]=ctime(&timep1)[i];timep[i]=0;//起始时间记录}//起始时刻记录main(){int a[30001],num,i,margin,n;float t;char timep[2][30];time_t timep2;printf("1:插入排序\n\n");printf("2:选择排序\n\n");printf("3:冒泡排序\n\n");printf("4:快速排序\n\n");printf("5:堆排序\n\n");printf("6:归并排序\n\n");loop:printf("请选择排序方法,输入序号\n");scanf("%d",&num);switch(num){case 1:mark(timep[0]);random(a);n=1;insort(a);break;//插入排序函数case 2:mark(timep[0]);random(a);n=1;selsort(a);break;//选择排序函数case 3:mark(timep[0]);;random(a);n=1;bubsort(a);break;//冒泡排序函数case 4:mark(timep[0]);n=99;for(i=0;i<n;i++){random(a);quicksort(a);}break;//快速排序函数case 5:mark(timep[0]);n=99;for(i=0;i<n;i++){random(a);heapsort(a);}break;//堆排序函数case 6:mark(timep[0]);n=9;for(i=0;i<n;i++){random(a);mergesort(a,1,30001);}break;//归并排序函数default:{printf("ERROR,重新输入");goto loop;}}time(&timep2);for(i=0;ctime(&timep2)[i]!=0;i++)timep[1][i]=ctime(&timep2)[i];timep[1][i]=0;//运行末时刻记录margin=work1(timep);//计算时间差for(i=1;i<30001;i++)printf("%d ",a[i]);printf("\n\n\n所需时间为%.3f秒",((float)margin)/n);}。

相关文档
最新文档