Ⅰ c語言,如何實現以前到現在的日期排序
直接用qsort吧
// crt_qsort.c
// arguments: every good boy deserves favor
/* This program reads the command-line
* parameters and uses qsort to sort them. It
* then displays the sorted arguments.
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int compare( const void *arg1, const void *arg2 );
int main( int argc, char **argv )
{
int i;
/* Eliminate argv[0] from sort: */
argv++;
argc--;
/* Sort remaining args using Quicksort algorithm: */
qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );
/* Output sorted list: */
for( i = 0; i < argc; ++i )
printf( " %s", argv[i] );
printf( "\n" );
}
int compare( const void *arg1, const void *arg2 )
{
/* Compare all of both strings: */
return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}
對結構體二級排序
struct In
{
int x;
int y;
}s[100];
//按照x從小到大排序,當x相等時按照y從大到小排序
int cmp( const void *a , const void *b )
{
struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
Ⅱ C語言排序的方法
現在流行的排序有:直接插入排序、冒泡排序、簡單選擇排序、希爾排序、快速排序、堆排序、歸並排序、基數排序。
對n個記錄進行選擇排序的方法是:通過n-i次關鍵字之間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i(1<=i<=n)個記錄進行交換,當i等於n時所有記錄都已有序排列。
void selectsort(int data[],int n)
{
int i,j,k,temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(data[j]<data[k]) k=j;
if(k!=i)
{
temp=data[i];data[i]=data[k];data[k]=temp;
}//if
}//for
}//for
}//selectsort
Ⅲ 給數據排序並按程序運行時間排序附上時間的C語言程序詳解。可有賞私聊。
沒有說明要求哪種 排序,,,,,原理上可行的。
~
~
~
~
~
Ⅳ 【菜鳥求教】,怎麼用C語言,結構隨機生成若干個時間並排序呀,…」
#include<stdio.h>
#include<stdlib.h>
typedefstruct_timelist
{
inth;
intm;
ints;
intsum;
struct_timelist*next;
}timelist,*ptimelist;
timelist*first;//指向鏈頭
voidcreatime(intsize);//創建你需要的時間
voidsorttime();//對你所需要的時間排序,我是按升序
voidsortab(ptimelist*a,ptimelist*b);//把B數據給a數據
voiddisplay();//輸出
voiddeletetimelist();
intmain()
{
intsize;
first=NULL;
printf("請輸入你需要創建的時間個數 ");
scanf("%d",&size);
creatime(size);
stime();
display();
deletetimelist();
return0;
}
voiddisplay()
{
timelist*p;
for(p=first;p!=NULL;p=p->next)
{
printf(" %-2dh:%-2dm:%-2ds ",p->h,p->m,p->s);
}
}
voidstime()
{
intflag;
timelist*p1,*p2;//指向鏈表操作的當前節點
timelist*t,*tt;//用於交換
tt=malloc(sizeof(timelist));
for(p1=first;p1->next!=NULL;p1=p1->next)//冒泡排序,敗筆,數據結構白學了,找不出比這更垃圾的演算法了。
{
flag=0;
for(p2=first;p2->next!=NULL;p2=p2->next)
{
if(p2->sum<(p2->next)->sum)
{
flag=1;
sortab(&tt,&p2);
sortab(&p2,&(p2->next));
sortab(&(p2->next),&tt);
}
}
if(flag==0)
break;
}
free(tt);
}
voidsortab(ptimelist*a,ptimelist*b)
{
(*a)->h=(*b)->h;
(*a)->m=(*b)->m;
(*a)->s=(*b)->s;
(*a)->sum=(*b)->sum;
}
voidcreatime(intsize)
{
inti;
timelist*p;//指向鏈表當前的節點的指針
for(i=0;i<size;i++)
{
if(first==NULL)//如果是第一次創建
{
first=malloc(sizeof(timelist));
p=first;
p->next=NULL;
}
else//不是第一次創建,在timelist尾部增加即可
{
p->next=malloc(sizeof(timelist));
p=p->next;
p->next=NULL;
}
p->h=rand()%24;//時,分,秒
p->m=rand()%60;
p->s=rand()%60;
p->sum=p->h*3600+p->m*60+p->s;
}
}
voiddeletetimelist()
{
timelist*p=first,*b;
while(p->next!=NULL)
{
b=p;
p=p->next;
free(b);
}
free(p);
}
有什麼沒問題可追問
代碼放在附件中
Ⅳ C語言 日期(年月日 ) 排序
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
/*
一月 Jan. January
二月 Feb. February
三月 Mar. March
四月 Apr. April
五月 May. May
六月 June. June
七月 July. July
八月 Aug. Aguest
九月 Sept. September
十月 Oct. October
十一月 Nov. November
十二月 Dec. December
縮寫:正規的英語中六月、七月不縮寫,九月的縮寫是4個字母,其他月份3個字母。
*/
char strm[12][10]={"Jan","Feb","Mar","Apr","May","June","July","Aug","Sept","Oct","Nov","Dec"};
struct Date
{
int y,d;
char m[10];
int value;
}d[10000];
int findm(char m[])
{
int i;
for(i=0;i<12;i++)
if(strcmp(m,strm[i])==0)return i;
return -1;
}
bool cmp(Date a,Date b)
{
return a.value<b.value;
}
int main()
{
int n=3,i,j;
/*
3
00 Jan 11
99 Feb 22
08 Mar 02
*/
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%s%d",&d[i].y,d[i].m,&d[i].d);
j=findm(d[i].m);
d[i].value=d[i].y*10000+j*100+d[i].d;
}
sort(d,d+n,cmp);
for(i=0;i<n;i++)
{
printf("%02d %s %02d\n",d[i].y,d[i].m,d[i].d);
}
return 0;
}
Ⅵ c語言中排序方法
1、冒泡排序(最常用)
冒泡排序是最簡單的排序方法:原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。(注意每一輪都是從a[0]開始比較的)
以從小到大排序為例,第一輪比較後,所有數中最大的那個數就會浮到最右邊;第二輪比較後,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最後實現從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來回排序或快樂小時排序, 是冒泡排序的一種變形。該演算法與冒泡排序的不同處在於排序時是以雙向在序列中進行排序。
原理:數組中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。
3、選擇排序
思路是設有10個元素a[1]-a[10],將a[1]與a[2]-a[10]比較,若a[1]比a[2]-a[10]都小,則不進行交換。若a[2]-a[10]中有一個以上比a[1]小,則將其中最大的一個與a[1]交換,此時a[1]就存放了10個數中最小的一個。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數,以此類推。
4、插入排序
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素*
一般來說,插入排序都採用in-place在數組上實現。
具體演算法描述如下:
⒈ 從第一個元素開始,該元素可以認為已經被排序
⒉ 取出下一個元素,在已經排序的元素序列中從後向前掃描
⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置
⒋ 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復步驟2~5
Ⅶ c語言的兩種排序
1、選擇排序法
要求輸入10個整數,從大到小排序輸出
輸入:2 0 3 -4 8 9 5 1 7 6
輸出:9 8 7 6 5 3 2 1 0 -4
代碼:
#include<stdio.h>
int main(int argc,const char*argv[]){
int num[10],i,j,k,l,temp;
//用一個數組保存輸入的數據
for(i=0;i<=9;i++)
{
scanf("%d",&num<i>);
}
//用兩個for嵌套循環來進行數據大小比較進行排序
for(j=0;j<9;j++)
{
for(k=j+1;k<=9;k++)
{
if(num[j]<num[k])//num[j]<num[k]
{
temp=num[j];
num[j]=num[k];
num[k]=temp;
}
}
}
//用一個for循環來輸出數組中排序好的數據
for(l=0;l<=9;l++)
{
printf("%d",num[l]);
}
return 0;
}
2、冒泡排序法
要求輸入10個整數,從大到小排序輸出
輸入:2 0 3-4 8 9 5 1 7 6
輸出:9 8 7 6 5 3 2 1 0-4
代碼:
#include<stdio.h>
int main(int argc,const char*argv[]){
//用一個數組來存數據
int num[10],i,j,k,l,temp;
//用for來把數據一個一個讀取進來
for(i=0;i<=9;i++)
{
scanf("%d",&num<i>);
}
//用兩次層for循環來比較數據,進行冒泡
for(j=0;j<9;j++)
{
for(k=0;k<9-j;k++)
{
if(num[k]<num[k+1])//num[k]<num[k+1]
{
temp=num[k];
num[k]=num[k+1];
num[k+1]=temp;
}
}
}
//用一個for循環來輸出數組中排序好的數據
for(l=0;l<=9;l++)
{
printf("%d",num[l]);
}
return 0;
}
(7)c語言按照時間戳排序擴展閱讀:
return 0代表程序正常退出。return是C++預定義的語句,它提供了終止函數執行的一種方式。當return語句提供了一個值時,這個值就成為函數的返回值。
return語句用來結束循環,或返回一個函數的值。
1、return 0,說明程序正常退出,返回到主程序繼續往下執行。
2、return 1,說明程序異常退出,返回主調函數來處理,繼續往下執行。return 0或return 1對程序執行的順序沒有影響,只是大家習慣於使用return(0)退出子程序而已。
Ⅷ 編寫C語言程序,把一個數組按從小到大的次序排列起來
源程序以及演算法注釋如下:
#define _CRT_SECURE_NO_WARNINGS//VS編譯環境需要進行宏定義,VC6.0可忽略
#include<stdio.h>//輸入輸出頭文件
int main()
{
int number[10], New_number[10];//定義數組的數據類型為整型
int i, j, m, n, k;//定義變數的數據類型為整型
printf("input 10 <int> number:");//文字提示
for (i = 0; i <= 9; i++)//用循環輸入數值給數組number並賦給數組New_number
{
scanf("%d", &number[i]);//輸入10個整形數字到數組中
New_number[i] = number[i];//數組number元素賦給數組New_number
}
for (n = 0; n <= 8; n++)//要進行(10-1)組比較
for (j = 0; j <= 8 - n; j++)//每組進行(10減第幾組)次比較
{
if (number[j] > number[j + 1])//比較大小並將小的賦給前面的數組
{
k = number[j];//將相對較大的元素賦值給中間元素
number[j] = number[j + 1];//將相對較小的元素送達前面一個位置
number[j + 1] = k;//將中間變數元素送給後面一個位置
}
if (New_number[j] < New_number[j + 1])//比較大小並將大的賦給前面的數組
{
k = New_number[j + 1];//將相對較小的元素賦值給中間元素
New_number[j + 1] = New_number[j];//將相對較大的元素送達前面一個位置
New_number[j] = k;//將中間變數元素送給後面一個位置
}
}
printf("min-->max:
");//文字提示
for (m = 0; m <= 9; m++)//依次從小到大輸出
printf("%d ", number[m]);//輸出元素
printf("
");
printf("max-->min:
");//文字提示
for (m = 0; m <= 9; m++)//依次從大到小輸出
printf("%d ", New_number[m]);//輸出元素
printf("
");
return 0;
}
程序運行結果如下:
(8)c語言按照時間戳排序擴展閱讀:
其他簡單實現程序:
#include<stdio.h>
int main()
{
int a[10]={0};
int i,j,temp;
for(i = 0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i = 0;i<10;i++)
{
for(j = 0;j<10-i-1;j++)
{
if(a[j]>a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(i = 0;i<10;i++)
printf("%d ",a[i]);
return 0;
}
Ⅸ c語言 排序 隨機函數 排序時間
你指的隨機函數每次產生的長度都不一樣是產生的隨機數位數不一樣吧,那是肯定的,而且他肯定在1~20000范圍內。至於第二個問題是你輸出的問題,time_t是long型的,你用float型輸出肯定是0,應改為printf("t=%dms\n",t);
Ⅹ C語言 排序 時間
#include "stdio.h"
#include "string.h"
//日期結構體
struct date
{
char y[3];//年
char m[4];//月
int d;//日
};
//新增加,將字元串表示的年份轉成整形表示
int intY(char *a)
{
int k = 0;
k += a[0] - '0';//十位上的數值
k = k*10 + (a[1] - '0');//十位上的數值乘以10再加上個位上的數值
return k;
}
//比較年份(修改後,參數類型變了)
int cmpY(char *y1, char *y2)
{
//新增加兩條語句
int a = intY(y1);
int b = intY(y2);
//年份在90-10之間,代表1990年到2010年
if (a 10)
a += 1900;
else
a += 2000;
if (b 10)
b += 1900;
else
b += 2000;
if (a > b)
return 1;
else if (a == b)
return 0;
else
return -1;
}
//比較月份
int cmpM(char *a, char *b)
{
//定義字元串數組,表示12個月份的英文
char m[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
int i, j;
for (i = 0; i b.d)
return 1;
else if(a.d == b.d)
return 0;
else
return -1;
}
}
}
void main()
{
//定義結構體數組
struct date dt[3]={
{"00", "Jan", 11},
{"99", "Feb", 22},
{"08", "Mar", 2}};
struct date dtTemp;
int i, j;
//排序
for (i = 0; i < 3-1; i++)
for (j = i+1; j < 3; j++)
if (cmpYMD(dt[i],dt[j]) == 1)
{
dtTemp = dt[i];
dt[i] = dt[j];
dt[j] = dtTemp;
}
//輸出排序過後的日期
for (i = 0; i < 3; i++)
{
//修改輸出格式
printf("%s %s %d\n",dt[i].y,dt[i].m,dt[i].d);
}
}