Ⅰ 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]);
}
(1)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;
}
參考資料來源:冒泡排序-網路
Ⅱ C語言冒泡排序加解題思路
冒泡排序,就是對一組數進行逐趟排序的方法,具體分為升序和降序。
以升序為例。
每一趟的任務,就是從一組數的第一個數開始,依次比較相鄰的兩個數的大小。既然是升序,那麼比較後,如果前者大於後者,那麼兩者交換位置。就這樣依次地比下去。
這樣的話,第一趟就把最大的數排到了最後。
而每再比較一趟的時候,都排除已經生成的結果,比如第二趟,不會再比較最後一個數(它已經是最大的了,當然如果比較也沒問題,浪費時間而已);第三趟,不會再比較最後兩個數。。。
每一趟都把最大的數排到當前范圍的末尾。
這樣循環下去,每一趟都會把當前范圍內最大的數扔到後面去。排序就完成了。
------------------------------------------------------------------------------------------------------------------------------
舉個升序排序的例子:
對於{ 10,5,3,11,9 }這組數,
第一趟,10與5比較,10 比5大,所以互換位置(5,10,3,11,9),10和3比較,10>3,所以互換位置(5,3,10,11,9),10與11比較,不用互換位置;11與9比較,互換位置(5,3,10,9,11),第一趟結束;
第二趟,由於11已經是最大的,那麼只剩下{5,3,10,9};5>3,所以互換位置(3,5,10,9);5<10,不用互換位置;10>9,互換位置(3,5,9,10),第二趟結束。
第三趟,只剩下{3,5,9},3<5,不用互換位置;5<9,不用互換位置,第三趟結束。
第四趟,只剩下{3,5},3<5,不用互換位置,第四趟結束。
此時由於只剩兩個數,本趟已經把兩個數較大的一個放到了第二的位置,所以循環到此結束。
結果就是{3,5,9,10,11}。
過程中,每一趟都會把相鄰的兩個數中較大的換到後面,即每趟中,最大的數都會被置換到最後,就像一個氣泡浮出水面一樣,越來越大,到出水時就是最大的。所以才叫冒泡排序。
Ⅲ 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
void sort(int *a,int len)
{int i=0;
int j;
int t;
for(i=0;i<len-1;i++)[1]
{
for(j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main(int argc, char *argv[])
{
int a[10]={
-999,2,3,77,12,88,0,-8,99,100
};
int i=0;
sort(a,10);
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
Ⅳ C語言冒泡法排序題目求解
#include <stdio.h>
#include <stdlib.h>
const int M = 5;
const int N = 4;
const int L = 3;
void main(){
int i = 0,j = 0,k;
FILE *fp1=NULL,*fp2=NULL;
int matr1[M][N],matr2[N][L],matr3[M][L];
//從文本文件1中讀入矩陣
printf("The array 1 is :\n");
fp1 = fopen("../array1.txt","r");
if(!fp1)
{
printf("Can not open file!\n");
exit (0);
}
for (i=0;i<M;i++){
for (j=0;j<N;j++){
fscanf(fp1,"%d",&matr1[i][j]);
}
}
for (i=0;i<M;i++){
for (j=0;j<N;j++){
printf("%d\t",matr1[i][j]);
}
printf("\n");
}
fclose(fp1);
//從文本文件2中讀入矩陣
printf("The array 2 is:\n");
fp2 = fopen("../array2.txt","r");
if(!fp2)
{
printf("Can not open file!\n");
exit (0);
}
for (i=0;i<N;i++){
for (j=0;j<L;j++){
fscanf(fp2,"%d",&matr2[i][j]);
}
}
for (i=0;i<N;i++){
for (j=0;j<L;j++){
printf("%d\t",matr2[i][j]);
}
printf("\n");
}
fclose(fp2);
//實現矩陣相乘,並將結果矩陣寫入新的文件
printf("The result is :\n");
FILE* fp=NULL;
if((fp = fopen("../result.txt","a+"))==NULL)
{
printf("Can not open file!\n");
exit(0);
}
for(i = 0;i<M;i++){
for(j = 0;j<L;j++){
matr3[i][j] = 0;
for(k = 0;k<N;k++){
matr3[i][j] += matr1[i][k]*matr2[k][j];
}
printf("%d\t",matr3[i][j]);
}
printf("\n");
}
for(i = 0;i<M;i++){
for(j = 0;j<L;j++){
fprintf(fp,"%d\t",matr3[i][j]);
}
fputs("\n",fp);
}
fclose(fp);
}
Ⅳ 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 sort(int *a,int len)
{int i=0;
int j;
int t;
for(i=0;i<len-1;i++)[1]
{
for(j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main(int argc, char *argv[])
{
int a[10]={
-999,2,3,77,12,88,0,-8,99,100
};
int i=0;
sort(a,10);
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}