编程排序
A. 谁能帮我详细解答下编程里的几种排序方法。
详解: http://ke..com/w?ct=17&lm=0&tn=WikiSearch&pn=0&rn=10&word=%C5%C5%D0%F2&submit=search归并排序 归并排序归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是... 5千字 2008-7-24 coolxiaojiB 快速排序 概述快速排序(Quick Sort)是一种有效的排序算法。虽然算法在最坏的情况下运行时间为O(n^2),但由于平均运行时间为O(nlogn),并且在内存使用、程序实现复杂性上表现优秀,尤其是对快速排序算法进行随机化的可能,使得快速排序在一般情况下是最实用... 8千字 2008-7-29 追月一族2 堆排序 斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了着名的堆排序算法( Heap Sort ) 定义n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1... 10千字 2008-7-14 Watfourane 冒泡排序 冒泡排序:BubbleSort基本概念冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两... 3千字 2008-4-12 凛冬将至_ 排序算法 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。分类在计算机科学所使用的排序算法通常被分类为: 计算的复杂度(最差、平均、和最好表现),依据串行(list)的大小(n)。一般而言,好的表现... 5千字 2008-3-18 12月26日魔羯座 希尔排序 希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。希尔排序基本思想基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直... 2千字 2008-1-15 WXD11011 基数排序 “基数排序法”(radix sort)则是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,借以达到排序的作用,基数排序法是属于稳定性... 2千字 2007-12-23 gotolabel Shell排序 希尔排序是一种快速排序法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。基本思想:不断把待排序的对象分成若干个小组,对同一小组内的对象采用直接插入法排序,当完成了所有对象都分在一个组内的排序后,排序过程结束。... 1千字 2006-10-14 raoping2005 选择排序 基本思想 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。排序过程 【示例】: 初始关键字 [49 38 65 97 76 13 27 49]第一...
B. 编程之排序方法
java语言中的排序有很多种,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等,详细资料可以去查看详细的资料。
C. 怎么在慧编程图形化编程的列表中进行排序
算法比较少。
从左边找到第一个最大的,从右边找到一个最小的,然后交换,直到左边下标大于右边下标,然后交换left和右边下标对应的数据再进行递归运算。
缩小排序范围,即去掉最后方位置正确的元素,对前方数组进行新一轮遍历,重复第1步骤。直到范围不能缩小为止,排序完成。
D. 有关如何编程排列大小顺序的问题
这是最常用的排序算法。利用双重循环排序。对于一个由N个数字组成的数组,在外层循环中,依次取前N-1项(循环变量i从0到N-2,共N-1项)作为比较中的不等式左边的数,这里假设取第i项;在内层循环中,对数组中i之后的各项做内层循环,即从第i+1项到第N-1项,作为不等式右边的数。比较的结果是为了交换两个数,假如希望数字按递增顺序排列,则当左边>右边时,对两个数的位置进行交换,交换要借助于一个临时变量t,先将左边放到t中,然后将右边放到左边,最后再将t放到右边,这样就实现了两个数位置的交换。当双重循环遍历的所有的数之后,顺序就排好了。
外层循环应该是i=0; i<=8; i++; 内层循环为j=i+1; j<9; j++; 比较的不等式应该是:if (a[i]>a[j])
E. C语言编程:选择法排序
选择排序是一种简单直观的排序算法。
工作原理:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
性能:
选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
选择排序的时间复杂度是O(n^2)
思想:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
C语言版代码:
#include<stdio.h>
#include<math.h>
#defineMAX_SIZE101
#defineSWAP(x,y,t)((t)=(x),(x)=(y),(y)=(t))
voidsort(int[],int);/*selectionsort*/
intmain()
{
inti,n;
intlist[MAX_SIZE];
printf(":");
scanf_s("%d",&n);
if(n<1||n>MAX_SIZE){
fprintf(stderr,"Impropervalueofn ");
exit(1);
}
for(i=0;i<n;i++){/*randomlygeneratenumbers*/
list[i]=rand()*1000;
printf("%d",list[i]);
}
sort(list,n);
printf(" Sortedarray: ");
for(i=0;i<n;i++)/*printoutsortednumbers*/
printf("%d",list[i]);
printf(" ");
return0;
}
voidsort(intlist[],intn)
{
inti,j,min,temp;
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++)
if(list[j]<list[min])
min=j;
SWAP(list[i],list[min],temp);
}
}
F. 我们编程用到的排序方法有哪些我只知道快速、冒泡
1.选择法排序(升序)
基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。
合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序)
基本思想:
1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;
2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;
3)将另一个数组剩余元素抄入C数组,合并排序完成。
插入法
把一个数插到有序数列中,插入后数列仍然有序
基本思想:n个有序数(从小到大)存放在数组a(1)—a(n)中,要插入的数x。首先确定x插在数组中的位置P
G. 怎样通过计算机编程将一列数从大到小排列
编程中有很多“排序”算法,比如每次把一列数循环访问一遍,记录下最大的数,输出,并从这列数中去除。如此反复,每次都取出剩余数列中最大的数,直到所有数都被输出。这列数就被从大到小排列了。这就是最简单的一种排序。
H. 用C语言编程排序
81H,88H,A3H,03H,47H,E2H,76H,D8H,13H,50H,排序后为81H,03H,88H,47H,A3H,76H,E2H,13H,D8H,50H
#define MAX 10
int main(void)
{
int i = 0 , j = 0 , k = 0 ;
int a[MAX] , b[MAX];
for(i = 0 ; i < MAX ; i++)
{
//scanf("%b" , a[i] );
scanf("%x" , a[i]);
}
for(i = 0 , j = 0 , k = 1 ; i < MAX ; i++)
{
if(a[1] &0X80 ==0)//负数
{
b[j++] = a[i];
}
else
{
b[k++] = a[i] ;
}
}
for(i = 0 ; i < MAX ; i++)
{
printf("%x " , b[i] );
}
return 0 ;
}
I. C语言编程 排序方法实现功能
冒泡排序,选择排序,快速排序,归并排序,堆排序,基数排序,希尔排序
冒泡排序代码:
void puple_sort(int a[],int num)
{
int i = 0,j = 0,temp = 0;
for(i = num - 1; i > 0; i--)
{
for(j = 0; j < i; j++)
{
if(a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j+1];
a[j + 1] = temp;
}
}
}
}
J. C语言编程 排序
/*有一种排序方法叫RadixSort,就是针对这种多关键字的排序的
时间复杂度线性的,但是有个缺点就是必须知道关键字的范围,不知道题主的关键字范围是多少?
好吧,假设我的关键字最多有100个,基数最大不超过999
程序如下:*/
//Radix Sort算法,采取LSD(低位优先)
#include<stdio.h>
#include<stdlib.h>
#define KEYNUM 100 //关键字的最大个数
#define RADIX 1000 //基数的范围是0-RADIX-1
typedef struct Node
{
int ele[KEYNUM+1];
struct Node *next;
} Node;
Node *e[RADIX],*f[RADIX]; //链队列的首指针和尾指针表
void init(Node* head,int n,int m) //初始化输入链表
{
int i,j;
Node *p,*q=head;
for(i=0; i<n; i++)
{
p=(Node*)malloc(sizeof(Node));
if(!p)
return;
for(j=1; j<=m; j++)
scanf("%d",&p->ele[j]);
p->next=NULL;
q->next=p;
q=q->next;
}
}
void distribute(Node* head,int locate,int r) //进行Radix排序
{
Node *p,*q;
int i;
while(head->next!=NULL)
{
q=head->next;
head->next=q->next;
q->next=NULL;
p=f[q->ele[locate]];
while(p->next!=NULL)
p=p->next;
p->next=q;
e[q->ele[locate]]->next=q;
}
p=head;
for(i=0; i<=r; i++)
{
while(f[i]->next!=e[i]->next)
{
q=f[i]->next;
f[i]->next=q->next;
q->next=NULL;
p->next=q;
p=p->next;
}
q=f[i]->next;
if(q)
{
f[i]->next=q->next;
q->next=NULL;
p->next=q;
p=p->next;
}
f[i]->next=e[i]->next=NULL;
}
}
void display(Node* head,int m) //显示链表各个节点
{
int i;
Node* p=head->next;
if(!head)
return;
while(p)
{
for(i=1; i<=m; i++)
printf("%d ",p->ele[i]);
printf(" ");
p=p->next;
}
}
void Delete(Node* head) //释放链表节点
{
Node *p;
if(!head)
return;
while(head->next)
{
p=head->next;
head->next=p->next;
free(p);
}
}
int main()
{
Node* head;
int n,m,r,i;
for(i=0; i<RADIX; i++) //初始化首尾指针指向空指针
{
f[i]=(Node*)malloc(sizeof(Node));
e[i]=(Node*)malloc(sizeof(Node));
if(!f[i]||!e[i])
exit(1);
f[i]->next=e[i]->next=NULL;
}
head=(Node*)malloc(sizeof(Node));
if(!head)
return 1;
printf("待排序个数以及关键字的个数:");
scanf("%d%d",&n,&m);
printf("输入数据: ");
init(head,n,m);
printf("输入基数范围0-n:");
scanf("%d",&r);
for(i=m; i>=1; i--)
distribute(head,i,r); //从低位到高位进行Radix排序
display(head,m);
for(i=0; i<RADIX; i++) //释放首尾指针数组
{
free(f[i]);
free(e[i]);
}
Delete(head);
free(head);
return 0;
}
题主的答案: