c++ 利用min求前i項陣列的最小值_五種陣列的排序方法(C語言)Part1
阿新 • • 發佈:2021-02-11
技術標籤:c++ 利用min求前i項陣列的最小值
個人觀點:其實拋開思想從語法上來說,大致分為三種就夠了(氣泡排序、插入法排序、折半法排序)
今天在這裡我們先討論前面三種(即氣泡排序)這方面的內容。
喜歡我的內容,記得動動你們的雙手,雙擊點個贊鴨!
一、選擇法排序
核心思想:(從小到大排序)外迴圈對陣列中的每一個元素進行逐個選中,在選中某一個元素時以內迴圈將這個陣列餘下未排序的最小值找出與之交換。
實現程式碼:
for (i = 0; i < 9; i++) { min = a[i]; //假設當前元素為最小值 m = i; //記錄最小值的位置 for (j = i + 1; j < 10; j++) { if (a[j] < min)//如果這個元素的值比當前記錄的最小值還小就記錄這個元素 { min = a[j]; //記錄最小值 m = j; //記錄最小值的位置 } } //這裡跳出內迴圈後,我們就得到了餘下元素裡面的最小值 a[m] = a[i]; //將當前元素賦值給擁有最小值的元素 a[i] = min; //將最小值賦值給當前元素,這裡我們就達到了交換資料的目的 }
這裡我們是假設一個數組a[10],通過外層迴圈,每次記錄當前位置為最小值(為了避免後面元素沒有比當前位置元素小時,交換位置步驟之後資料發生錯誤)以及當前的位置,加以內迴圈找出當前位置元素及餘下未排序的元素中的最小值,進行資料之間的交換,得到有序數列。
至於外迴圈為什麼迴圈到<9就結束,是為了減少運算。當迴圈到a[8]時就只餘下一項a[9]了,將他們進行比較之後,將較小的賦值給了a[8],a[9]不就理所當然的是最大值了嗎?
一個完整的程式:
//這是一個選擇排序 #include <stdio.h> #include <stdlib.h> int main() { int i, j; int a[10]; int m, n; printf("為陣列賦值:n"); //從鍵盤為陣列元素賦值 for (i = 0; i < 10; i++) { printf("a[%d]", i); scanf("%d", &a[i]); } //從小到大排序 for (i = 0; i < 9; i++) { m = a[i]; n = i; for (j = i + 1; j < 10; j++) { if (a[j] < m) { m = a[j]; n = j; } } //交換兩個元素值 a[n] = a[i]; a[i] = m; } //輸出陣列 for ( i = 0; i < 10; i++) { printf("%dn",a[i]); } system("pause"); return 0; }
你看,解釋的很清楚有木有!
是的話,別忘記了雙擊鴨!
二、交換法排序
核心思想:依次逐個選中一個元素,將之與後面的每一個數一一比較,如果後面數值比當前元素小就交換數值,直至最後一個數。
實現程式碼:
for ( i = 0; i < 9; i++) { for ( j = i+1; j < 10; j++) { if (a[j]<a[i]) { min=a[j]; a[j]=a[i]; a[i]=min; } } }
同樣,這裡我們假設了一個a[10],外出迴圈依次定位每一個元素,在通過一個內層迴圈與逐個和後面餘下的元素進行比較,如果後面元素比當前元素小就交換他們之間的數值,以實現陣列從小到大排序。
一個完整的程式:
//這是一個交換排序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, c = 0, n[10];
printf("為元組賦值:n");
for (a = 0; a < 10; a++)
{
printf("請輸入n[%d]: n", a);
scanf("%d", &n[a]);
}
//從小到大排序
for (a = 0; a < 10; a++)
{
for (b = 0; b < 10; b++)
{
//交換順序
if (n[a] < n[b])
{
c = n[a];
n[a] = n[b];
n[b] = c;
}
}
}
//輸出有序元組
for (a = 0; a < 10; a++)
{
printf("n[%d]=%dn", a, n[a]);
}
system("pause");
return 0;
}
三、冒泡法排序
核心思路:
小的資料就像水中的氣泡總是逐漸上升,大的資料就像石塊往下沉,因此稱為氣泡排序法。
通過兩個迴圈:外迴圈控制已排好序的位置,內迴圈將大數下沉或小數冒泡。
實現程式碼:
//氣泡排序法(小數冒泡)
for ( i = 0; i < 10; i++)
{
for ( j = 9; j >=i; j--)
{
if (a[j]<a[j-1])
{
//交換兩個陣列的值
min=a[j];
a[j]=a[j-1];
a[j-1]=min;
//氣泡排序,如果後一個數比前一個數小的話就交換他們之間的順序
}
}
//每結束一次內迴圈就將此次迴圈內進行排序的較小的值向前冒
}
//氣泡排序法(大數下沉)
for (i = 0; i < 10; i++)
{
for ( j = 0; j < 10-i-1; j++)
//這裡“j<10-i-1”的含義是減去最後面已經排序的,同時“-1”是因為排序到最後,同前面原理一樣,最後一個數不用排列
{
if (a[j]>a[j+1])
{
max=a[j];
a[j]=a[j+1];
a[j+1]=max;
}
}
}
一個完整的程式:
//這是一個氣泡排序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j;
int a[10];
int m;
printf("為陣列元素賦值:n");
for (i = 0; i < 10; i++)
{
printf("a[%d]=", i);
scanf("%d", &a[i]);
}
//從小到大排序
for (i = 0; i < 10; i++)
{
for (j = 9; j >= i; j--)
{
if (a[j] < a[j - 1])
{
//交換兩個陣列元素的值
m = a[j - 1];
a[j - 1] = a[j];
a[j] = m;
}
}
}
//輸出陣列
for (i = 0; i < 10; i++)
{
printf("a[%d]=%dn", i, a[i]);
}
system("pause");
return 0;
}
okok,今天的講解就介紹到這裡,大家可以關注我期待下一期的更新鴨!
最後,最後最重要的是記得給個雙擊、雙擊、雙擊啊~
歡迎大家關注我的公眾號,每期都能給你不一樣的收貨!
如何在VS code中配置C語言環境mp.weixin.qq.com![547465e62d004f3754a4559bfab403a0.png](https://img.796t.com/res/2021/02-11/19/3fe49597661fb20ebf16aedb61f9910b.png)