編程排序
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;
}
題主的答案: