排序

<pre name="code" class="cpp">/*******************************************EXPLANATION******************************************
*泡沫排序:循环对每个元素进行判断,如果一个元素大于后一个元素就进行交换位置,循环在while内进行,*
*如果元素都是按规定排列的,就false,循环结束,如果没有按规排列,就true,继续循环,直到false为止	*
*数组:array1[MAXNUM] = { 7, 5, 4, 0, 9, 2, 6, 3, 8, 1 }										*
*第一次循环:5,4,0,7,2,6,3,8,1,9返回true;														*
*第二次循环:4,0,5,2,6,3,7,1,8,9还是返回true													*
*第最后一次循环:0,1,2,3,4,5,6,7,8,9,返回false循环结束,可见效率很低,进行了多次没必要的重复排序*
*************************************************************************************************
请问大神这样编辑才能把文字用这样的*号框括起来,很美观,框里放文字时在csdn上发布的框就不整齐
***********************************这个框****************************************
*                                                                               *
*                                                                               *  
*                                                                               *
*********************************************************************************/
//泡沫排序10000个数整个用时888毫秒,不打印用时256毫秒;100000个数整个用时32785毫秒,不打印时用时26957毫秒
/*#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#define MAXNUM 100000
int external = 0;
int internal = 0;
void print(int *array, int n)
{
	for (int i = 0; i<n; ++i)
	{
		printf(" %d", array[i]);

	}
	printf("\nexternal=%d,internal=%d\n", external, internal);
}
void bubble(int *array, int n)
{
	external = 0;
	internal = 0;
	bool flag = true;
	int temp = 0;
	int end = n - 1;
	while (flag)
	{
		++external;
		flag = false;//判断是否有元素未按规定排列如果没有就不会进入内部循环,flag=false结束循环
		for (int i = 0; i<end; ++i)
		{
			++internal;
			if (array[i]>array[i + 1])//如果一个元素大于下个元素就交换位置,
			{
				temp = array[i];
				array[i] = array[i + 1];
				array[i + 1] = temp;
				flag = true;
			}
		}
		--end;//对已经排好的数组忽略
	}
}


int main()
{
    time_t now=clock();
	
	printf("55");
	int array1[MAXNUM];
	for(int i=0,v=MAXNUM;i<MAXNUM;++i,--v)
	{
		array1[i]=v;
	}
		
	bubble(array1,MAXNUM);
	
	
	
	
	printf("9999");
	
	//print(array1, MAXNUM);
	int now1=clock()-now;
	printf("\nnow1=%d\n",now1);

/*	int array1[MAXNUM] = { 7, 5, 4, 0, 9, 2, 6, 3, 8, 1 };
	bubble(array1, MAXNUM);
	print(array1, MAXNUM);


	int array2[MAXNUM] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	bubble(array2, MAXNUM);
	print(array2, MAXNUM);


	int array3[MAXNUM] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	bubble(array3, MAXNUM);
	print(array3, MAXNUM);
	return 0;
}*/
/*******************************************EXPLANATION***********************************************************
*插入排序:现将前面元素按大小排列,再用下一个元素对已经排好的元素里进行比较,把这个元素按大小顺序插入			 *
*直到所有元素都插入到已经排好的数组中,                                                                          *
*数组:array1[MAXNUM] = { 7, 5, 4, 0, 9, 2, 6, 3, 8, 1 }										                 *
*第一次循环:5,7,4,0,9,2,6,3,8,1;外部循环i=0;														             *
*第二次循环:4,5,7,0,9,2,6,3,8,1;外部循环i=1;											                         *
*当外部循环i加到i=n-1时:0,1,2,3,4,5,6,7,8,9,结束循环,同时数组都已经按大小排列								     *
******************************************************************************************************************/
//插入排序10000个数整个用时829毫秒,不打印277毫秒;100000个数整个用时31263毫秒,不打印26135毫秒
/*#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#define MAXNUM 100000
int external = 0;
int internal = 0;
void print(int *array, int n)
{
	printf("\n");
	for (int i = 0; i<n; ++i)
	{
		printf(" %d", array[i]);
	}
	printf("\nexternal=%d,internal=%d", external, internal);
}
void shell(int *array, int n)
{
	external = 0;
	internal = 0;
	int temp = 0, j = 0;
	for (int i = 0; i<n - 1; ++i)//先将头两个元素按大小顺序排列,每次循环都将排列好的元素和下个元素进行比较直到i=n-1
	{
		++external;
		for (j = i; j >= 0 && array[j + 1]<array[j]; --j)//将元素和排好的元素交换位置
		{
			++internal;
			temp = array[j + 1];
			array[j + 1] = array[j];
			array[j] = temp;
		}
	}
}
int main(){
	 time_t now=clock();
	
	printf("55");
	int array1[MAXNUM];
	for(int i=0,v=MAXNUM;i<MAXNUM;++i,--v)
	{
		array1[i]=v;
	}
		
	shell(array1,MAXNUM);
	
	
	
	
	printf("9999");
	
	//print(array1, MAXNUM);
	int now1=clock()-now;
	printf("\nnow1=%d\n",now1);

	// 10 个数
	/*int data[10] = { 5, 2, 3, 0, 1, 7, 4, 6, 8, 9 };
	shell(data, 10);
	print(data, 10);


	int data1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	shell(data1, 10);
	print(data1, 10);


	int data2[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	shell(data2, 10);
	print(data2, 10);
	int array[49] = { 7, 8, 4, 6, 3, 5, 9, 7, 1, 432, 32325, 434, 36546, 465466, 547, 6, 67, 6, 8, 78, 
		78, 876, 876, 86, 6, 86, 68, 676, 8, 76, 658, 867, 8, 8, 768, 69, 87, 87, 987987, 7, 98, 9, 79, 87,
		98, 98, 9, 87, 987, };
	shell(array, 49);
	print(array, 49);


	return 0;
}*/
/*******************************************EXPLANATION***********************************************************
*选择排序:在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小       *
*(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。  *
******************************************************************************************************************/
//选择排序10000个数整个用时714毫秒,不打印150毫秒;100000个数整个用时20747毫秒,不打印14373毫秒
#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#define MAXNUM 100000
int external = 0;
int internal = 0;
void print(int *array, int n)
{
	printf("\n");
	for (int i = 0; i<n; ++i)
	{
		printf(" %d", array[i]);
	}
	printf("\nexternal=%d,internal=%d", external, internal);
}
void select(int *array, int n)
{
	int temp = 0, j = 0, k = 0;
	external = 0;
	internal = 0;
	for (int i = 0; i<n - 1; ++i)
	{
		++external;
		j = i;
		for (k = j + 1; k<=n - 1; ++k)
		{
			++internal;
			if (array[j]>array[k])
			{
				j = k;//标记较小元素
			}
		}
		if (j != i)//判断是是否相等,再交换位置,把较大或者较小的数放在i位,
		{
			temp = array[i];
			array[i] = array[j];
			array[j] = temp;
		}
	}
}




int main(){
	// 10 个数
	 time_t now=clock();
	
	printf("55");
	int array1[MAXNUM];
	for(int i=0,v=MAXNUM;i<MAXNUM;++i,--v)
	{
		array1[i]=v;
	}
		
	select(array1,MAXNUM-1);
	
	
	
	
	printf("9999");
	
	//print(array1, MAXNUM);
	int now1=clock()-now;
	printf("\nnow1=%d\n",now1);
	/*int data[10] = { 5, 2, 3, 0, 1, 7, 4, 6, 8, 9 };
	select(data, 10);
	print(data, 10);


	int data1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	select(data1, 10);
	print(data1, 10);


	int data2[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
	select(data2, 10);
	print(data2, 10);
	
	int array[49] = { 7, 8, 4, 6, 3, 5, 9, 7, 1, 432, 32325, 434, 36546, 465466, 547, 6, 67, 6, 8, 78, 
		78, 876, 876, 86, 6, 86, 68, 676, 8, 76, 658, 867, 8, 8, 768, 69, 87, 87, 987987, 7, 98, 9, 79, 87,
		98, 98, 9, 87, 987 };
	select(array, 49);
	print(array, 49);*/


	return 0;
}
/*******************************************EXPLANATION***********************************************************
*希尔排序:把数组按当前当量距离进行分组,对数组进行趟数次排序并逐次缩小当量,每趟对当量距离的元素的小组进行排序  *
*记录,最后一次当量必须为1,才能对全体记录进行依次直接插入排序                                                   *  
******************************************************************************************************************/
/*10000个数排列整个用时808毫秒,不打印123毫秒

#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#define MAXNUM 10000

int internal = 0;
int external = 0;
int n = MAXNUM;
void print(int array[],int n);
void main()
{
	void shellSort(int array[], int t);
	int array1[MAXNUM];
	time_t now=clock();
	for(int i=0,v=MAXNUM;i<MAXNUM;++i,--v)
	{
		array1[i]=v;
	}
	
	shellSort(array1, log(MAXNUM + 1) / log(2));//log(MAXNUM+1)为趟数计算公式
	time_t now1=clock()-now;
	printf("\nnow1=%d",now1);
	//print(array1,MAXNUM);
	
}
void shellInsert(int array[], int dk)
{


	printf("\ndk=%d", dk);
	int i, j, temp;
	for (i = dk; i<n; i++)//当前当量下,对每组进行排序记录
	{
		++internal;

		temp = array[i];
		//printf("\narray[i]=%d,i=%d", array[i], i);
		for (j = i - dk; (j >= i%dk) && array[j]>temp; j -= dk)
		{
			++internal;
			//printf("111array[j+dk]=%d,array[j]=%d,j=%d", array[j + dk], array[j], j);
			array[j + dk] = array[j];

		}
		//printf("\n77777");
		//print(array);
		if (j != i - dk)
		{
			//printf("222array[j+dk]=%d,temp=%d,j=%d.i-dk=%d", array[j + dk], temp, j, i - dk);
			array[j + dk] = temp;
		}
		//printf("\n888");
		//print(array);
	}
	//printf("\n6666");
	//print(array);

}


int dkHibbard(int t, int k)//计算当量当量可随意必须小于个数且最后当量必须为1
{
	int q;
	//int q=pow(t-k,2)


	q = 2;
	if (k == 2)
	{
		q = 1;
	}
	//printf("\nq=%d", q);
	return q;
}
void shellSort(int array[], int t)//对数组进行趟数次排序
{
	void shellInsert(int array[], int dk);
	int i;
	for (i = 1; i <= 2; i++)
	{
		++external;
		shellInsert(array, dkHibbard(t, i));
	}
}




void print(int *array, int n)
{
	printf("\n");
	for (int i = 0; i<n; ++i)
	{
		printf(" %d", array[i]);
	}
	printf("\nexternal=%d,internal=%d", external, internal);

}
*************************************************************************************************/
//快速排序10000个数整个用时786毫秒,不打印150毫秒
/*#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include <stdlib.h>
#define MAXNUM 10000

int external = 0;
int internal = 0;
void print(int *array, int n)
{
	for (int i = 0; i<n; ++i)
	{
		printf(" %d", array[i]);

	}
	printf("\nexternal=%d,internal=%d\n", external, internal);
	external=0;
	internal=0;
	
}
void queklysort(int *array, int left,int right)//递归函数,
{	//printf("1000");
	if(left>=right)
	{
		return ;
	}
	int min=left,max=right,temp=array[max];//交换的设定的中间值标记为temp,用区间[left,right]内元素和设定的中间值进行比较
	while(min<max)//当min=max时,区间[left,right]内的元素比设定中间值大的放区间右边,小的放左边,
	{	
		++external;                                             
		
		for(;min<max&&temp>=array[min];++min,++internal);//在从[min,max]区间内的左边找比设定的中间值大的的元素,
		array[max]=array[min];//当left=0,right=n-1;array4:5,3,4,2,0,5找到后往区间右边放,
		for(;min<max&&temp<=array[max];--max,++internal);//在从[min,max]区间内的右边找比设定的中间值小的的元素,找到后往区间左边放,没找到继续缩小比较区间
		array[min]=array[max];//array4:1,3,4,2,0,5,找到后往区间左边放,
	}
	array[max]=temp;//当结束while循环时min=max;设定的中间值的索引值就是min
	queklysort(array,left,--max);//以设定的中间值左边的元素为一个区间,再从中设定一个中间值,把比这个值大的往右放,小的往左放
	queklysort(array,++min,right);//以设定的中间值右边的元素为一个区间,再从中设定一个中间值,把比这个值大的往右放,小的往左放
}

	

int main()
{
	time_t now=clock();
	
	printf("55");
	int array1[MAXNUM];
	for(int i=0,v=MAXNUM;i<MAXNUM;++i,--v)
	{
		array1[i]=v;
	}
		
	queklysort(array1,0, MAXNUM-1);
	
	
	
	//for(;now1<10000000;now1=clock()-now);
	printf("9999");
	int now1=clock()-now;
	printf("\nnow1=%d\n",now1);
	//print(array1, MAXNUM);
	
	/*int array1[MAXNUM] = { 7, 5, 4, 0, 9, 2, 6,3, 3, 8, 1 };
	queklysort(array1,0, MAXNUM-1);
	print(array1, MAXNUM);


	int array2[MAXNUM] = { 0, 1, 2, 3, 4, 5, 6,0, 7, 8, 9 };
	queklysort(array2, 0,MAXNUM-1);
	print(array2, MAXNUM);


	int array3[MAXNUM] = { 9, 8, 7, 6, 5, 4, 3, 2,2, 1, 0 };
	queklysort(array3,0, MAXNUM-1);
	print(array3, MAXNUM);8*

	int array[49] = { 7, 8, 4, 6, 3, 5, 9, 7, 1, 432, 32325, 434, 36546, 465466, 547, 6, 67, 6, 8, 78, 
		78, 8763334333, 876, 86, 6, 86, 68, 676, 8, 76, 658, 867, 8, 8, 768, 69, 87, 87, 987987, 7, 98, 9, 79, 87,
		98, 98, 9, 87, 987 };
	queklysort(array,0, 48);
	print(array, 49);

	/*int array4[6] = { 5,3,4,2,0,1};
	queklysort(array4, 0,6-1);
	print(array4, 6);

	return 0;
}*/
/*#include<stdio.h>
#include<iostream>
#include<fstream>
#include<bitset.h>
#include<time.h>
using namespace std;
const int MAX=5000000;
int main()
{
    time_t t1=clock();
    //freopen("outputran.txt","r",stdin);
    //freopen("outputran1.txt","w",stdout);
    FILE *fp_in = fopen("outputran.txt", "r");
    FILE *fp_out = fopen("sort.txt", "w");
    bitset<MAX> bit;
    int a;
    while(fscanf(fp_in,"%d",&a)!=EOF){
        if(a<=MAX) bit.set(a, 1);
    }
    for(int i=0;i<=MAX;i++){
        if(bit[i]) fprintf(fp_out,"%d ",i);
    }
    fseek(fp_out, 0, SEEK_SET);
    bit.reset();
    while(fscanf(fp_in,"%d",&a)!=EOF){
        if(a>MAX){
            bit.set(a-MAX, 1);
        }
    }
    for(int i=0;i<=MAX;i++){
        if(bit[i]) fprintf(fp_out,"%d ",i+MAX);
    }
    time_t t2=clock();
    printf("\n%d ",(t2-t1)%1000000);
    return 0;
}*/

//归并(排列10000个数时整个用584毫秒,不打印用时1毫秒,100000个数整个用时6176毫秒,不打印12毫秒

/*#include <stdio.h>
#include <stdbool.h>
#include <time.h>
#include <stdlib.h>
#define MAXNUM 100000
int external = 0;
int internal = 0;
int k=0;
void print(int *array, int n)
{
	

	
	for (int i = 0; i<n; ++i)
	{
		//array[i]=temp[i];
		printf(" %d",array[i]);

	}
	printf("\nexternal=%d,internal=%d\n", external, internal);
	external=0;
	internal=0;
	
}
void merge(int array[],int left ,int mid ,int right,int *temp)
{
	++internal;
	//printf("\nmid=%d,left=%d,right=%d",mid,left,right);
	//int *temp=(int *)malloc((right-left+1)*sizeof(int));
	int s1=left;
	int e1=mid;
	int s2=mid+1;
	int e2=right;
	int k=left;
	for(;s1<=e1&&s2<=e2;k++)
	{
		
		if(array[s1]<array[s2])
		{
			temp[k]=array[s1++];
		}
		else
		{
			temp[k]=array[s2++];
		}
	}
	while(s1<=e1&&k<=MAXNUM)
	{
		temp[k++]=array[s1++];
		//printf("\ntemp[%d]=%d",k-1,temp[k-1]);
	}
	while(s2<=e2&&k<=MAXNUM)
	{
		temp[k++]=array[s2++];
		
	}
	for(int  i=left;i<k;i++)
	{
		array[i]=temp[i];
		//printf("\ntemp[%d]=%d,array[%d]=%d",i,temp[i],i,array[i]);
	}
	
	
	//printf("left=%d,right=%d,mid=%d,k=%d",left,right,mid,k);
	//print(temp, MAXNUM,temp);
}

void merger1(int array[],int left,int right,int *temp)
{	
	++external;
	//printf("22");
	int mid=0;
	if(left<right)
	{
		mid=(right+left)/2;
		merger1(array,left,mid,temp);
		merger1(array,mid+1,right,temp);
		merge(array,left,mid,right,temp);
	}

		
	
}

int main()
{	
	time_t now=clock();
	int *temp=(int *)malloc((MAXNUM)*sizeof(int));
	//printf("55");
	int array1[MAXNUM];
	for(int i=0,v=MAXNUM;i<MAXNUM;++i,--v)
	{
		array1[i]=v;
	}
		
	merger1(array1,0, MAXNUM-1,temp);
	
	
	
	//for(;now1<10000000;now1=clock()-now);
	
	print(array1, MAXNUM);
	int now1=clock()-now;
	printf("\nnow1=%d\n",now1);
	free(temp);
	//printf("666");
	
	/*temp=(int *)malloc((MAXNUM)*sizeof(int));
	int array2[MAXNUM] = { 0, 1, 2, 3, 4, 5, 6,0, 7, 8, 9 };
	merger1(array2, 0,MAXNUM-1,temp);
	print(array2, MAXNUM);
	free(temp);
	temp=(int *)malloc((MAXNUM)*sizeof(int));

	int array3[MAXNUM] = { 9, 8, 7, 6, 5, 4, 3, 2,2, 1, 0 };
	merger1(array3,0, MAXNUM-1,temp);
	print(array3, MAXNUM);
	free(temp);
	temp=(int *)malloc((49)*sizeof(int));
	int array[49] = { 7, 8, 4, 6, 3, 5, 9, 7, 1, 432, 32325, 434, 36546, 465466, 547, 6, 67, 6, 8, 78, 
		78, 8763334333, 876, 86, 6, 86, 68, 676, 8, 76, 658, 867, 8, 8, 768, 69, 87, 87, 987987, 7, 98, 9, 79, 87,
		98, 98, 9, 87, 987 };
	merger1(array,0, 48,temp);
	print(array, 49);

	int array4[6] = { 5,3,4,2,0,1};
	merger1(array4, 0,6-1,temp);
	print(array4, 6);

	return 0;
}*/



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值