當前位置:首頁 » 編程語言 » 冒泡排序c語言指針遞歸
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

冒泡排序c語言指針遞歸

發布時間: 2022-12-09 04:21:34

Ⅰ 選擇排序 冒泡排序 c語言

從程序運行需要的時間和儲存空間來看,這兩個吧,選擇排序用的時間較少。我給你舉個例子,這是一個比較直觀的例子:
有十個數:10,9,8,7,6,5,4,3,2,1 。將他們按從小到大的順序排成一列,用這兩種方法的區別在於如下過程中:
1、 冒泡排序:
外層循環一共進行9次,第一次將10排到最後,這一步要經很9步交換,即將10依次和9,8,7……交換,成為如下順序:9,8,7,6,5,4,3,2,1,10;接著第二次將9排到倒數第二,這一步要經過8步交換,變成如下順序:8,7,6,5,4,3,2,1,9,10;同理執行共九大步,即可將它們最終排成1,2,3,4,5,6,7,8,9,10。
從這個過程可以看到,這種方法在這個過程中一共進行了9+8+7+6+5+4+3+2+1=45次比較和交換。
2、 選擇排序:
外層也要經過9次大步,但是不用交換45次.首先要假定一個最大量假設是第一個,並用max標記,第一次,將10依次和9,8,7,6,5,4,3,2,1進行比較,但是只是和1進行了一次交換,這時數列成了:1,9,8,7,6,5,4,3,2,10;第二次:將1和9比較,發現9比較大,那麼將9暫時定為最大max,再依次和8,7,6,5,4,3,2比較,最後發現9最大,就把9和倒數第二個位置上的2交換,這一大步共進行了兩次交換;依次執行下去,後面每大步進行了兩次交換,可以看出,一共進行了1+2+2+2+2+2+2+2+1=16次交換,但是也進行了45次比較。
從上面兩種可以看出,這兩個方法選擇排序更高速,但是某些數據可能使得冒泡排序更高速,即交換次數較少,可以看出演算法快慢和數據還是有一定關系的。
至於代碼,我寫了一個選擇排序法的,c++環境運行通過:

請將下面代碼復制粘貼到程序寫入窗口,按下Ctrl+A全選後,按下Alt+F8即可自動對齊格式:

#include<stdio.h>
#include<time.h>/*包含時間函數,以便作為隨機數種子*/
#include<stdlib.h>/*包含產生隨機數的文件*/
void main()
{
int i,j,temp,max;
int a[10];
srand((unsigned)time(NULL));/*作用是可以每次產生不一樣的隨機數*/
for(i=0;i<10;i++)
{
a[i]=rand()%51+49;
}
for(i=0;i<10;i++)
{
printf("a[%d]=%2.0d\t\t",i+1,a[i]);/*控制格式*/
}
printf("\n");
for(i=0;i<10;i++)
{
temp =a[10-i];max=10-i;/*設定最大值*/
for(j=0;j<10-i;j++)
{
if(a[j]> temp)
{
temp =a[j];max=j;/*更新最大值*/
}
}
if(max!=10-i)
{
a[max]=a[10-i];a[10-i] = temp;/*不能忘記將找到最大值處用假設最大值補上!*/
}
}
for(i=0;i<10;i++)
{
printf("a[%d]=%d\t\t",i+1,a[i]);
}
}
沒有寫冒泡法的,相信你也能寫了。寫了這么久,希望得個辛苦分。
另外有問題隨時問。

Ⅱ c語言。編寫一個冒泡排序演算法s使用指針將n個整型數據按升序排序

#include<stdio.h>

int main()

{

int a[111],t;

int *p=a;

int n;

scanf("%d",&n);

for(p=a;p<a+n;p++)

scanf("%d",p);

p=a;

for(int i=0;i<n;i++)

for(int j=0;j<n-1-i;j++)

if(p[j]>p[j+1])

{

t=p[j];

p[j]=p[j+1];

p[j+1]=t;

}

for(int i=0;i<n;i++)

printf("%d ",a[i]);

return 0;

}

——————————————————————

#include<stdio.h>

#include<malloc.h>

#include<string.h>

int main()

{

char *p[30];

for(int i=0;i<5;i++)

{

p[i]=(char*)malloc(30*sizeof(char));

//使用指針變數時要先為其分配空間

gets(p[i]);

}

for(int i=0;i<5;i++)

puts(p[i]);

return 0;

}

Ⅲ c語言冒泡排序

冒泡排序,是一種計算機科學領域的較簡單的排序演算法。它重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重復地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。

這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端,就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名「冒泡排序」。

冒泡排序就是把小的元素往前調或者把大的元素往後調:

比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,是不會再交換的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以冒泡排序是一種穩定排序演算法。

Ⅳ 編寫一個C語言程序,使用指針實現冒泡排序。

修改後的程序
#include
<stdio.h>
#define
n
7
int
main()
{
int
i,j,ptr_2=0;
int
a[n],*ptr_1;
ptr_1=&a[0];
printf("輸入%d個數:",n);
for
(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("ok1\n");
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if
(*(ptr_1+j)
<
*(ptr_1+j+1))
{
ptr_2=*(ptr_1+j+1);
*(ptr_1+j+1)=*(ptr_1+j);
*(ptr_1+j)=ptr_2;
}
}
}
printf("排序後的數為:
");
for(i=0;i<n;i++)
{
printf("%d
",*ptr_1);
ptr_1++;
}
printf("\n");
return
0;
}
注意ptr_2是指針,未申請空間不能*ptr_2復值。

Ⅳ C語言遞歸實現冒泡排序

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void show(int *a,int n)
{
while(n--)printf("%d ",*a++);
printf("\n");
}
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
void bubble(int *a, int n)
{
int i;
if(n<2)return;
for(i=0;i<n-1;i++)
if(a[i]>a[i+1])
swap(&a[i],&a[i+1]);
bubble(a,n-1);
}
int main()
{
int a[20];
const int n = sizeof(a)/sizeof(*a);
int i;
srand(time(0));
for(i=0;i<n;i++)a[i]=rand()%n;
show(a,n);
bubble(a,n);
show(a,n);
return 0;
}

Ⅵ c語言 指針的方法 對一維數組進行 冒泡排序

大概思路:用指針p指向數組的首地址,用指針去引用數組中的各個元素,並對數組中各個元素就行運算和比較操作了,代碼可以參照如下:
#include
<stdio.h>
#include
<stdlib.h>
int
main()
{
int
array[5];
int
i,j,*p,temp;
p=array;
printf("please
input
some
integer:\n");
for(i=0;i<5;i++)
{
scanf("%d",p++);
}
p=array;
printf("排序前為:\n");
for(i=0;i<5;i++)
{
printf("%-5d",*p++);
}
p=array;
for(i=0;i<4;i++)
{
for(j=0;j<4-i;j++)
{
if(*(p+j)>*(p+j+1))
//用指針去引用數組中的元素並進行比較
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
printf("排序之後:\n");
for(i=0;i<5;i++)
{
printf("%-5d",*p++);
}
return
0;
}

Ⅶ C語言冒泡排序法是什麼

冒泡排序法,是C語言常用的排序演算法之一,意思是對一組數字進行從大到小或者從小到大排序的一種演算法。

具體方法是:

相鄰數值兩兩交換。從第一個數值開始,如果相鄰兩個數的排列順序與我們的期望不同,則將兩個數的位置進行交換(對調);如果其與我們的期望一致,則不用交換。重復這樣的過程,一直到最後沒有數值需要交換,則排序完成。

C語言常見的排序演算法:

1、冒泡排序

基本思想:比較相鄰的兩個數,如果前者比後者大,則進行交換。每一輪排序結束,選出一個未排序中最大的數放到數組後面。

2、快速排序

基本思想:選取一個基準元素,通常為數組最後一個元素(或者第一個元素)。從前向後遍歷數組,當遇到小於基準元素的元素時,把它和左邊第一個大於基準元素的元素進行交換。在利用分治策略從已經分好的兩組中分別進行以上步驟,直到排序完成。

3、直接插入排序

基本思想:和交換排序不同的是它不用進行交換操作,而是用一個臨時變數存儲當前值。當前面的元素比後面大時,先把後面的元素存入臨時變數,前面元素的值放到後面元素位置,再到最後把其值插入到合適的數組位置。

4、直接選擇排序

基本思想:依次選出數組最小的數放到數組的前面。首先從數組的第二個元素開始往後遍歷,找出最小的數放到第一個位置。再從剩下數組中找出最小的數放到第二個位置。以此類推,直到數組有序。

以上內容參考 網路-排序演算法、網路-c語言冒泡排序


Ⅷ C語言冒泡排序法是怎麼排序的

C語言冒泡排序法的排序規則:

將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為R.key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。

  1. 初始 R[1..n]為無序區。

  2. 第一趟掃描 從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。

    即依次比較(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]上。

  3. 第二趟掃描 掃描R[2..n]。

    掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上…… 最後,經過n-1 趟掃描可得到有序區R[1..n] 注意: 第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R上,結果是R[1..i]變為新的有序區。