排序

来源:互联网 发布:剑三成女脸型数据网盘 编辑:程序博客网 时间:2024/06/05 18:57
<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 100000int 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 100000int 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 100000int 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 10000int 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 10000int 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;设定的中间值的索引值就是minqueklysort(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 100000int 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;}*/


                                             
0 0
原创粉丝点击