⑴ c語言中冒泡排序法(又稱起泡排序法)得具體程序
冒泡法我是這樣理解的,便於掌握和記憶。首先冒泡是n長度的數組開始的兩位開始,逐位雙雙比較一直到最後兩個,所以最外循環比較了n-1次。第一個數比較了以後就不比了,從第二個開始,一直比較到數組末尾,於是內循環的起始位置不同,每次都是外側i的值加0,也就是i。但結束的限制和外層循環是相同的。於是寫法為for (i=0;i<n-1;i++)
{
for(j=i;j<n-1;j++)
⑵ 急!!求c語言單鏈表冒泡排序的詳細流程圖
#include<stdio.h> #include<malloc.h> struct number { int num; struct number *next; }; void main() { struct number *head; struct number *p1,*p2,*p,*p3,*p4; int n=0,m,i,j; p1=p2=(struct number *)malloc(sizeof(struct number)); printf("\nWang jianfei 060806110006\n\n\n"); printf("Please enter the number: \n"); scanf("%d",&p1->num); head=NULL; while(p1->num!=NULL) { n=n+1; if(head==NULL) head=p1; else p2->next=p1; p2=p1; p1=(struct number *)malloc(sizeof(struct number)); scanf("%d",&p1->num); } p2->next=NULL; p=head; for(p4=head;p4!=NULL;p4=p4->next) { for(p3=head;p3->next!=NULL;p3=p3->next) { if(p4->num>p3->num) { m=p4->num; p4->num=p3->num; p3->num=m; } } p=head; } printf("\nNow,there %d numbers are: ",n); p=head; printf("\n"); if(head!=NULL) do { printf("%5d ",p->num); p=p->next; }while(p!=NULL); printf("\n"); getch(); }
⑶ 排序演算法的設計(c語言)根據程序畫流程圖及對每句程序加註釋
#include "stdio.h"//標准io頭文件
#include "stdlib.h"//庫文件
#include "time.h"//時間系頭文件
#define N0 100000 //定義常量
typedef int keytype; //類型命名
typedef struct node //定義結構體
{ keytype key; //只是類型命名成keytype,其實就是int的
}Etp;//結構體類型叫做Etp
Etp R[N0+1]; // R[1]..R[n] //定義數組
int n=50, count;//全局變數
void readData( Etp R[], int n)//讀數據的函數
{ int i;
count=0;
srand( time( NULL ));//初始化時間種子
for( i=1; i<=n; i++) //對數組初始化
R[i].key=1000+
(int)((9999.0-1000)*rand()/RAND_MAX); // 0..RAND_MAX
}
void printData( Etp R[], int n )//列印顯示數據的函數
{ int i;
for( i=1; i<=n; i++)
printf("%8d%s", //格式化顯示數組的數據
R[i].key, i%5==0?"\n":"");
printf("\ncount=%d\n", count);
}
void bubberSort( Etp R[], int n )//冒泡排序的函數
{ int i,j;//(這個函數塊就是冒泡排序的演算法程序)
bool swap;
for( i=1; i<=n-1; i++)
{ swap=false;
for( j=1; j<=n-i; j++)
if( count++,R[j].key>R[j+1].key )
{ R[0]=R[j];
R[j]=R[j+1];
R[j+1]=R[0];
swap=true;
}
if( !swap ) break;
}
}
void bubberSort1( Etp R[], int n )//這個也是另一個冒泡排序的函數
{ int j;//跟上面不同的是這個演算法用的是遞歸的方式,上面的是非遞歸的
for( j=1; j<=n-1; j++)
if( count++,R[j].key>R[j+1].key )
{ R[0]=R[j];
R[j]=R[j+1];//________;//就是兩個變數交換值
R[j+1]=R[0];
}
if( n>1 ) bubberSort1( R, n-1); //___________;//遞歸調用
}
void selectSort( Etp R[], int n )//這個是選擇排序
{ int i,j,k;//(這個函數塊就是選擇排序的演算法程序)
for( i=1; i<=n-1; i++)
{
k=i;
for( j=i+1; j<=n; j++)
if( count++,R[j].key<R[k].key ) k=j;
if( k!=i )
{ R[0]=R[i];
R[i]=R[k];
R[k]=R[0];
}
}
}
void insertSort( Etp R[], int n )//這個是插入排序
{ int i,j;
for( i=2; i<=n; i++)
{
R[0]=R[i];
j=i-1;
while( count++,R[j].key>R[0].key ) R[j+1]=R[j--];
R[j+1]=R[0];
count++;
}
}
void sift( Etp R[], int i, int m)//堆排序中的步驟
{ int k=2*i;
R[0]=R[i];
while( k<=m )
{ if( count++, k+1<=m && R[k+1].key>R[k].key) k++;
if( count++,R[0].key<R[k].key ) R[i]=R[k];
else break;
i=k;
k=2*i;
}
R[i]=R[0];
}
void heapSort( Etp R[], int n )//這個是堆排序
{ int j;
for( j=n/2; j>=1; j--) sift( R, j, n);
for( j=n; j>=2; j--)
{ R[0]=R[1];
R[1]=R[j];
R[j]=R[0];
sift( R, 1, j-1 );
}
}
int main()//主函數的進入口
{
readData( R, n );//讀取數據
bubberSort1( R, n );//調用遞歸冒泡排序
printData( R, n);//顯示數據
readData( R, n );//讀取數據
selectSort( R, n );//調用選擇排序
printData( R, n);//顯示數據
readData( R, n );//讀取數據
insertSort( R, n );//調用插入排序
printData( R, n);//顯示數據
readData( R, n );//讀取數據
heapSort( R, n );//調用堆排序
printData( R, n);//顯示數據
return 0;
}
//誒·~注釋完我總算看出來了,難道你要我解釋各個排序的過程?
//那你還不如直接或者看書,你要是不理解原理是不可能看懂過程的。
//注釋也只是語句的解釋,但是過程的含義是無法描述的
⑷ C語言冒泡排序法是什麼
冒泡排序法,是C語言常用的排序演算法之一,意思是對一組數字進行從大到小或者從小到大排序的一種演算法。
具體方法是:
相鄰數值兩兩交換。從第一個數值開始,如果相鄰兩個數的排列順序與我們的期望不同,則將兩個數的位置進行交換(對調);如果其與我們的期望一致,則不用交換。重復這樣的過程,一直到最後沒有數值需要交換,則排序完成。
C語言常見的排序演算法:
1、冒泡排序
基本思想:比較相鄰的兩個數,如果前者比後者大,則進行交換。每一輪排序結束,選出一個未排序中最大的數放到數組後面。
2、快速排序
基本思想:選取一個基準元素,通常為數組最後一個元素(或者第一個元素)。從前向後遍歷數組,當遇到小於基準元素的元素時,把它和左邊第一個大於基準元素的元素進行交換。在利用分治策略從已經分好的兩組中分別進行以上步驟,直到排序完成。
3、直接插入排序
基本思想:和交換排序不同的是它不用進行交換操作,而是用一個臨時變數存儲當前值。當前面的元素比後面大時,先把後面的元素存入臨時變數,前面元素的值放到後面元素位置,再到最後把其值插入到合適的數組位置。
4、直接選擇排序
基本思想:依次選出數組最小的數放到數組的前面。首先從數組的第二個元素開始往後遍歷,找出最小的數放到第一個位置。再從剩下數組中找出最小的數放到第二個位置。以此類推,直到數組有序。
以上內容參考 網路-排序演算法、網路-c語言冒泡排序
⑸ 誰能提供C語言里起泡法排序和快速排序法的流程圖謝謝!! 重賞!!
冒泡排序: (數字都是序號 1~9 為 第一到第九個數字 假如 一共9個數字比較)
1 和 2 比較 小於就交換位置 然後
1 和 3 比較 小於就交換位置 然後
1 和 4 比較 小於就交換位置 然後
......
1 和 9 比較 小於就交換位置 然後
2 和 3 比較 小於就交換位置 然後
2 和 4 比較 小於就交換位置 然後
......
2 和 9 比較 小於就交換位置 然後
3 和 4 比較 小於就交換位置 然後
3 和 5 比較 小於就交換位置 然後
....
...
8 和 9 比較 小於就交換位置 全部結束 所得序列從小到大排列
快速排列:
第一個數 跟 整個序列中間一個數比較 要是小於 就在跟前半段中間個數比較 要是又大於 就跟前半段中的後半段中間個數比較 來確定位置
如:
1 跟 (1+9)/2 比較 小於就繼續跟 (1+5)/2比較 大於就跟(5+9)/2比較
然後(假設是小於) 1跟(1+5)/2比較 又大於 那麼繼續1跟(3+5)/2比較 要是
1大於4那麼交換位置
然後第二段: 2 跟 (1+9)/2比較 小於就繼續跟 (1+5)/2比較 大於就跟(5+9)/2比較
以此類推...
9跟(1+5)/2 比較........
⑹ C語言冒泡排序法是怎麼排序的
C語言冒泡排序法的排序規則:
將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為R.key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
初始 R[1..n]為無序區。
第一趟掃描 從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。
即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。 第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。
第二趟掃描 掃描R[2..n]。
掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上…… 最後,經過n-1 趟掃描可得到有序區R[1..n] 注意: 第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R上,結果是R[1..i]變為新的有序區。
⑺ C語言冒泡排序。
#include<stdio.h>
void main()
{
int a[10];
int i,j,t;
printf("input 10 numbers: ");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(j=0;j<9;j++) /*進行9次循環 實現9趟比較*/
for(i=0;i<9-j;i++) /*在每一趟中進行9-j次比較*/
if(a[i]>a[i+1]) /*相鄰兩個數比較,想降序只要改成a[i]<a[i+1]*/
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers: ");
for(i=0;i<10;i++)
printf(" %d",a[i]);
}
(7)c語言冒泡排序流程圖擴展閱讀:
冒泡排序演算法的運作
1、比較相鄰的元素。如果第一個比第二個大(小),就交換他們兩個。
2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大(小)的數。
3、針對所有的元素重復以上的步驟,除了最後已經選出的元素(有序)。
4、持續每次對越來越少的元素(無序元素)重復上面的步驟,直到沒有任何一對數字需要比較,則序列最終有序。
簡單的表示
#include <stdio.h>
void swap(int *i, int *j)
{
int temp = *i;
*i = *j;
*j = temp;
}
int main()
{
int a[10] = {2,1,4,5,6,9,7,8,7,7};
int i,j;
for (i = 0; i < 10; i++)
{
for (j = 9; j > i; j--)//從後往前冒泡
{
if (a[j] < a[j-1])
{
swap(&a[j], &a[j-1]);
}
}
}
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}