冒泡法規律
A. 「冒泡排序法」是什麼
冒泡排序詳細注釋:
/* 用冒泡排序法對一維整型數組中的十個數升序排序 */
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,t,a[10];
printf("Please input 10 integers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++) /* 冒泡法排序 */
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1])
{t=a[j];/* 交換a[i]和a[j] */
a[j]=a[j+1];
a[j+1]=t;
}
printf("The sequence after sort is:\n");
for(i=0;i<10;i++)
printf("%-5d",a[i]);
printf("\n");
system("pause");
return 0;
}
其中i=0時:
j從0開始a[0],a[1]比較大小,把其中的較大者給a[1],然後j++,a[1]和a[2]再比較,再把兩者中的
較大者給a[2],這樣a[0],a[1],a[2]中的最大者已經交換到a[2]中,這個過程繼續,直到j=10-i-1=9這樣
a[9]中的為10個數中的最大數。
然後i=1時:
由於最大數已找到並放到a[9]中,所以這一次循環j最大隻需到10-i-1=8,即a[8]即可,再次從j=0開始a[j]和a[j+1]兩兩比較交換,最後次大數放到a[8]中
然後i++,繼續...
當i=9時已經過9次兩兩比較完成所有排序,i<9不再成立退出比較。
對於n個數,只需要進行n-1次外循環的兩兩比較就完成排序。
至於按降序排列只需將if(a[j]>a[j+1])改為if(a[j]<a[j+1])即可。
-------------------------------------------------------------------
/* 用改進型冒泡排序法對一維整型數組中的十個數升序排序 */
#include <stdio.h>
#include <stdlib.h>
int main()
{int i,j,t,a[10],flag;
printf("Please input 10 integers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++) /* 改進型冒泡法排序 */
{ flag=0;
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1])
{ t=a[j]; /* 交換a[i]和a[j] */
a[j]=a[j+1];
a[j+1]=t;
flag=1;
}
if(flag==0)break;
}
printf("The sequence after sort is:\n");
for(i=0;i<10;i++)
printf("%-5d",a[i]);
printf("\n");
system("pause");
return 0;
}
這個和上面的實質一樣,只是加了一個標志flag,當在一次大循環(即外層循環)內,在內層循環中如果 沒有發生一次交換,那麼就表示a[0]<a[1]<a[2]<a[3]<a[4]<a[5]<a[6]<a[7]<a[8]<a[9],即數組已經排序完成,此時直接退出循環,不用再比較了。
B. 用c語言編寫:輸入20個整數,分別用選擇法和冒泡法實現降序排列後,再按照每行5個數的規律輸出
/////冒泡法
#include <stdio.h>
void main ()
{
int i,a[100],n,j,k=1,t;
printf ("輸入個數n: ");//你要的是20,就輸入10吧
scanf ("%d",&n);
printf ("輸入%d個數據:\n",n);
for (i=0;i<n;i++)
{
printf ("a[%d]= ",i);
scanf ("%d",&a[i]);
}
for (i=1;i<n;i++)//冒泡排序
for (j=0;j<n-i;j++)
if (a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
printf ("排好序的數據為:\n");
for (i=0;i<n;i++)
{
printf ("%2d ",a[i]);
if (k%5==0)
printf ("\n");
k++;
}
printf ("\n");
}
//////選擇法
#include <stdio.h>
void main()
{
int min,t,i,j,k=1,n,a[100];
printf ("輸入個數n: ");//你要的是10,就輸入10吧
scanf ("%d",&n);
printf ("輸入%d個數據:\n",n);
for (i=0;i<n;i++)
{
printf ("a[%d]= ",i);
scanf ("%d",&a[i]);
}
for(i=0;i<n-1;i++)//選擇排序
{
min=i;
for(j=i+1;j<n;j++)
if(a[j]<a[min])
min=j;
if(i!=min)
{
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
printf ("排好序的數據為:\n");
for (i=0;i<n;i++)
{
printf ("%2d ",a[i]);
if (k%5==0)
printf ("\n");
k++;
}
printf ("\n");
}
C. 冒泡笑傲江湖有期貨的規律是什麼!!!高手告訴下!!!!!!!!
玉米風壓漲流就壓跌!!!壓漲豆麥花風壓跌豆麥花流的就壓漲~~~!!絲銀黃風就壓漲流行就壓跌鑽風壓漲流行就壓跌~~~~一般的時候都按這規律壓~~要麼按這規律反著壓!!有時候一小時會改一次規律!!!或半小時改次規律!!!我用這規律贏過幾萬點貨期就不太准就不說了~~~~~~`` 我一區的~
D. 線性表裡的冒泡排序和快速排序是什麼比較次數有什麼區別
冒泡排序是一種交換排序方式。設有n個數據依次放在數組元素a(1)至a(n)中,用冒泡法對這n個數據進行遞增排序的過程為:先比較a(1)與a(2),若逆序則交換之,接著比較a(2)與a(3),若逆序就交換……依次進行,知道將a(n-1)與a(n)比較交換完,才算完成了第一輪比較交換。然後以同樣規則進行第二次交換……一直到數據排好序為止。最壞情形下比較1/2 n(n-1)次,交換3/2 n(n-1)次。
快速排序是由著名計算機學家C.A.R.Hoare在起泡排序的基礎上提出的一種高效率的排序演算法。它的基本思想是:在待排序數列中選取一個元素(通常是第一個元素)x,按某一規律經過多次交換位置後,它移到某一位置,以此位置對原數列進行劃分,使得得到的兩個子數列對x來說符合排序規律。元素x稱為此數列中的劃分元素。接著按此方法對兩個字數列再劃分,直到得到不需要進一步劃分的子數列為止。這一過程具有明顯的遞歸性。
快速排序多數情況下比冒泡排序要高效,若需要演算法或代碼可以hi本人。
E. 冒泡演算法的改進
冒泡排序過程
設想被排序的數組R[1..N]垂直豎立,將每個數據元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R,凡掃描到違反本原則的輕氣泡,就使其向上"漂浮"(交換位置),如此反復進行,直至最後任何兩個氣泡都是輕者在上,重者在下為止。
性能分析
若記錄序列的初始狀態為"正序",則冒泡排序過程只需進行一趟排序,在排序過程中只需進行n-1次比較,且不移動記錄;反之,若記錄序列的初始狀態為"逆序",則需進行n(n-1)/2次比較和記錄移動。因此冒泡排序總的時間復雜度為O(n*n)。
冒泡排序實現
根據掃描方向不同,實現略有不同。
普通冒泡演算法
一般的冒泡排序的第i趟處理是從r[0]到r[n-i],依次比較相鄰兩個記錄的關鍵字,並在反序時交換相鄰的記錄,其結果是將這n-i+1個記錄中關鍵字最大的元素交換到第n-i+1的位置上。整個排序過程需要進行n-1趟處理。
冒泡演算法的改進:
改進1:增加1個標志位,記錄是否發生交換
我們在傳統的冒泡排序的基礎上增加一個標志位exchange用來表示在一次冒泡排序中,數組的順序是否發生改變,如果改變了,意味著數組可能還未排列好,所以要進行下一次冒泡排序,而如果exchange的值不為真,也就是說明該數組在本次冒泡排序中,數組的順序沒有發生改變,即數組已經有序,則排序結束。
改進2:記錄發生交換的最後位置
我們在改進1的基礎上將標志位記錄的信息修改為一次冒泡排序中最後一次交換數據的位置,這樣進行洗一次冒泡排序的時候,我們可以知道,在這個標志位記錄的位置後面的數據均已有序,也就不用考慮了,這樣就不用考慮改進1中exchange改變了之後,數組是否已經排好的情況了。
改進3:增加2個記錄位,雙向記錄發生交換的最後位置
我們在改進2的基礎上設想,很多數組是有一定的規律性的,如果我們考慮到很多數組自身存在的一些有序性的話,會使問題簡化很多,所以我們考慮,不僅僅可以設置單項的記錄位掃描,可以設置正反向雙向掃描,這樣需要增加2個記錄位,分別記錄上一次冒泡排序中正向和反向發生交換的最後位置,這樣就類似於從兩側開始向中間排序,最小的,次小的……從左邊開始排,最大的,次大的……從右邊開始排,大大提高了效率。
F. 什麼是冒泡程序啊
用來排序的,通過相鄰兩個數的比較,把大數或者小數冒到第一位,然後再冒次大或次小數。
G. py冒泡法排序
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序演算法。
它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。
這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的頂端,故名冒泡排序。
以上是網路詞條對冒泡排序的官方解釋。
但是我要說一下我的個人理解,我覺得冒泡排序的核心思想是:每次比較兩個數,如果他們順序錯誤(大於或者小於),那麼就把他們置換。
例如:如果要將五個無序的數字做升序排列(也就是從小到大排列),那麼利用冒泡排序如何實現呢?
首先,比較第一個數和第二個數的大小,由於是從小到大排列,所以如果第一個數大於第二個數,則將這兩個數互換位置,反之則不變。
然後進行第二個數和第三個數比較,同上。
這樣依次比較一輪後,你會發現,總共比了4次,也就是說,如果有n個數進行比較,那麼需要n-1次才能完成。
上面過程主要完成了一輪比較,最終確定了一個最大的數,並且排在5個數的最後,也就是第五個數。
那麼也就意味著需要在進行第一個數到第四個數的一輪比較,確定最大值。
接著從第一個數到第三個數......
這樣規律就很明顯了,五個數需要比較四輪,就能將5個數升序排列,所以n個數需要比較n-1輪。
以上就是冒泡排序的實現思路,接下來看代碼!
如何實現?
到底該怎麼實現呢?看了上面的分析,我相信你也能編出來吧!
print(list)
演算法的優劣主要看它的時間復雜度,冒泡排序的時間復雜度為:O(N^2)
可以看出,冒泡排序的時間復雜度偏高,所以它還不是最優演算法!
H. 冒泡排序穩定嗎
據我所知,冒泡的排序,並不是很穩定,因為冒泡是無規律的。
I. 跪求!!定義數組冒泡法排序!!!!!內祥~!
不知道你需要什麼語言編寫的,我這是用的C#編寫的一個控制台程序,與其他語言也只是語法不同,希望對你有幫助
static void Main(string[] args)
{
string str = Console.ReadLine();
string[] strs = str.Split(',');
int[] nums = new int[strs.Length];//這里是按用戶自己輸入的方式,如果你是需要定義11的數組可以修改為不讓用戶輸入
for (int i = 0; i < nums.Length; i++)
{
nums[i] = int.Parse(strs[i]);
}
nums = Sorting(nums);//調用冒泡排序方法
for (int i = (nums.Length - 1); i >= 0; i--)
{
Console.WriteLine(nums[i]);
}
Console.ReadKey();
}
///冒泡排序法(降序排序)
public static int[] Sorting(int[] nums)
{
int[] sizes = new int[nums.Length];
for (int i = 0; i < nums.Length; i++)
{
int size = 0;
for (int j = 0; j < nums.Length - i - 1; j++)
{
if (nums[j] > nums[j + 1])
{
size = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = size;
}
else
{
size = nums[j + 1];
}
}
if (i == nums.Length - 1)
{
size = nums[0];
}
sizes[i] = size;
}
return sizes;
}
J. 先採用冒泡法,將學生成績 從高到低進行排序,再輸入一個學生的成績,將此成績按照排序規律插入已排好序的
建立成績單,可以兩次輸入成績,學生總人數最大30人,成績按從大到小排列。下面是程序:
#include<stdio.h>
#definemax_NUM30
voidbubble_sort(inta[],intn)
{
inti=0,j=0,temp=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
voidinsert_sort(inta[],intn,intn1)//n為總人數,n1為設定從第n1個元素開始插入
{
inti=0,j=0,k=0,m=0,temp=0;
k=n1;
for(i=k;i<n;i++)
{
temp=a[i];
for(j=0;j<k-1;j++)
{
if(a[j]<temp)
{
break;
}
}
for(m=n1-1;m>=j;m--)
{
a[m+1]=a[m];
}
a[j]=temp;
k++;
}
}
voidmain()
{
intscore[max_NUM]={0};
inti=0,n1=0,n2=0;//n1為第一次輸入成績個數,n2為後補充輸入成績個數
printf("請輸入學生人數 ");
scanf("%d",&n1);
printf("輸入成績 ");
for(i=0;i<n1;i++)
{
scanf("%d",&score[i]);
}
bubble_sort(score,n1);
printf("請輸入後添加學生的人數 ");
scanf("%d",&n2);
if(n1+n2>max_NUM)
{
printf("人數太多 ");
return;
}
else
{
printf("請輸入成績 ");
for(i=n1;i<n1+n2;i++)
{
scanf("%d",&score[i]);
}
}
insert_sort(score,(n1+n2),n1);
printf("總人數成績清單,成績從高到低: ");
for(i=0;i<(n1+n2);i++)
{
printf("%d ",score[i]);
}
}
程序運行結果: