目的
昨天我們學(xué)習(xí)了數(shù)組枫浙,今天當(dāng)然是使用數(shù)組來(lái)寫(xiě)一些東西啦!當(dāng)然今天還學(xué)習(xí)了用幾種排序方式來(lái)進(jìn)行一些數(shù)的從大到小的排序狼牺。那么今天我們要怎么用這兩個(gè)知識(shí)點(diǎn)來(lái)寫(xiě)一個(gè)什么樣的程序呢?盡情期待!J焱琛!
幾種排序的方式
1.冒泡排序法
冒泡排序法是我之前還算記得牢靠的一種排列數(shù)字的方法伪节,顧名思義光羞,它的意思就是讓一個(gè)較大的元素通過(guò)“冒泡”的方式讓其漸漸的“浮”到數(shù)組的最后。
算法原理:
1.比較相鄰的元素怀大。如果第一個(gè)比第二個(gè)大纱兑,就交換他們兩個(gè)。
2.對(duì)每一對(duì)相鄰元素作同樣的工作化借,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)潜慎。在這一點(diǎn),最后數(shù)組的元素應(yīng)該會(huì)是最大的數(shù)屏鳍。
3.針對(duì)所有的元素重復(fù)以上的步驟勘纯,除了最后一個(gè)。
4.持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟钓瞭,直到?jīng)]有任何一對(duì)數(shù)字需要比較
代碼實(shí)現(xiàn):
int main(int argc, const char * argv[]) {
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10; i++){//比較的次數(shù)
for (int j = 0; j < 10-i-1; j++){
if (num[j] > num[j+1]) {
//交換j和j+1的值
int temp = num[j+1];
num[j+1] = num[j];
num[j] = temp;
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
2.選擇排序法
選擇排序就是要一組數(shù)中選出最大(最胁底瘛)的數(shù)然后將其放在第一位;然后找出剩下的數(shù)中找出第二大(猩轿小)的數(shù)放在第二位堤结;以此類推。最后就可以得到一組數(shù)的排序鸭丛。
算法原理:
1.對(duì)比數(shù)組中前一個(gè)元素跟后一個(gè)元素的大小竞穷,如果后面的元素比前面的元素小則用一個(gè)變量k來(lái)記住他的位置。
2.對(duì)每一對(duì)相鄰元素作同樣的工作鳞溉。從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)瘾带。在這一點(diǎn),最后我們會(huì)得到最小的數(shù)的位置熟菲。
3.然后進(jìn)行判斷看政,如果這個(gè)元素不是第一個(gè)元素,就讓第一個(gè)元素跟他交換一下值抄罕,這樣就找到整個(gè)數(shù)組中最小的數(shù)了允蚣。
4.然后找到數(shù)組中第二小的數(shù),讓他跟數(shù)組中第二個(gè)元素交換一下值呆贿,以此類推嚷兔。
代碼實(shí)現(xiàn):
int main(int argc, const char * argv[]) {
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10-1; i++){
//默認(rèn)這是最小的
//int min = num[i];//3
for (int j = i+1; j < 10; j++){
//控制用min和后面的每一個(gè)進(jìn)行比較
if (num[i] > num[j]){
//j對(duì)應(yīng)的數(shù)字比min還小 交換
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
//一次遍歷之后找到最小的值min
//num[i] = min;
}
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
3.插入排序法
其目的就是每一步都將一個(gè)待排數(shù)據(jù)按其大小插入到已經(jīng)排序的數(shù)據(jù)中的適當(dāng)位置,直到全部插入完畢。
算法實(shí)現(xiàn) :
1.選擇序列的第一個(gè)元素作為有序序列冒晰;
2.將后面的一個(gè)元素插入到前面的有序數(shù)列中同衣,以此類推。最后得到排序好的數(shù)列壶运。
int main(int argc, const char * argv[]) {
int num[] = {3,0,1,8,7,2,5,4,6,9};
for (int i = 0; i < 10; i++) {
//讓i和i+1比較大小
if (num[i] > num[i+1]) {
//交換值
int temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
//讓num[i]和前面的所有進(jìn)行比較
for (int j = i; j > 0; j--){
if (num[j] < num[j-1]) {
temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
}
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", num[i]);
}
printf("\n");
return 0;
}
實(shí)際使用
那么現(xiàn)在就來(lái)到了寫(xiě)代碼的環(huán)節(jié)了乳怎,今天我們寫(xiě)了兩個(gè)很有意思的代碼
1.“殺人”游戲
這個(gè)游戲就是將一群人圍成一圈編號(hào)比如7個(gè)人,繞著圈依次喊1前弯,2,3秫逝,當(dāng)有人喊到3時(shí)這個(gè)人退出游戲恕出,下一個(gè)重新喊1,2违帆,3浙巫,直到只剩下一個(gè)人
具體代碼實(shí)現(xiàn)
#include<stdio.h>
#include<iostream>
#define KILL -1
int main()
{
int total;
int killNumber;
int a[100];
int count=0;
printf("請(qǐng)輸入玩游戲的人數(shù):");
scanf_s("%d", &total);
printf("請(qǐng)輸入死亡編號(hào):");
scanf_s("%d", &killNumber);
for (int i = 0; i < total; i++)
{
a[i] = i + 1;
}
int number = 0;
for (int i = 0; i < total; i++)
{
if (a[i] != KILL)
{
number++;
if (number == killNumber)
{
a[i] =KILL;
count++;
if (count == total - 1)
{
break;
}
number = 0;
}
}
if (i == total - 1)
{
i = -1;
}
}
for (int i = 0; i < total; i++)
{
if (a[i] != KILL)
printf("%d",a[i]);
}
system("pause");
return 0;
}
2.第二個(gè)游戲
猜數(shù)字游戲;系統(tǒng)自動(dòng)生成按大小排序不重復(fù)的4個(gè)數(shù)刷后;自己輸入4個(gè)數(shù)的畴,然后進(jìn)行比較,如果位置對(duì)數(shù)字對(duì)輸出一個(gè)A如果數(shù)字對(duì)位置不對(duì)輸出B尝胆,根據(jù)系統(tǒng)提示輸入下一組數(shù)丧裁,直到全對(duì),結(jié)束游戲含衔。
#include<stdio.h>
#include<iostream>
#include"stdlib.h"
#include"time.h"http:// 含有隨機(jī)數(shù)函數(shù)的頭文件
void initArray(int array[]);
int main()
{
int array[4];
int myArray[4];
int countA = 0;
int countB = 0;
initArray(array);
for (int i = 0; i < 4; i++)
{
printf("%d ", array[i]);
}
while (1)
{
printf("輸入數(shù)字:");
for (int i = 0; i < 4; i++)
{
scanf_s("%d", &myArray[i]);
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
if (myArray[j] == array[i])
{
if (i == j)
{
countA++;
}
else
{
countB++;
}
}
}
}
if (countA == 4)
{
printf("恭喜<褰俊!L叭尽缓呛!");
break;
}
else {
printf("%dA%dB", countA, countB);
countA = 0;
countB = 0;
}
}
system("pause");
return 0;
}
void initArray(int array[]) {
srand((unsigned int)time(NULL)*10);//重置種子
for (int i = 0; i < 4; i++) {
int temp = 0;
bool isExist = false;
while (1) {
//產(chǎn)生一個(gè)隨機(jī)數(shù)
temp = rand() % 10;
//1 2 3
//判斷這個(gè)數(shù)字在數(shù)組里面是否存在
//i表示當(dāng)前數(shù)組里面已經(jīng)存進(jìn)去幾個(gè)了
for (int j = 0; j < i; j++) {
if (array[j] == temp) {
//存在了
isExist = true;
break;
}
}
//什么情況下出來(lái)
//1.break 2.遍歷完畢還沒(méi)找到相同
if (isExist == false) {
break;
}
}
//將這個(gè)隨機(jī)數(shù)添加到數(shù)組里面
array[i] = temp;
//進(jìn)行大小排序
for (int k = i; k > 0; k--)
{
if (array[k] <= array[k - 1])
{
int t;
t = array[k];
array[k] = array[k - 1];
array[k - 1] = t;
}
}
}
}
寫(xiě)在后面
可以看到在這兩個(gè)程序里面用了較多的排序,我們?cè)谂判驎r(shí)一定要注意循環(huán)是要遍歷整個(gè)數(shù)組杭隙;明白什么時(shí)候結(jié)束程序哟绊;在寫(xiě)排序程序時(shí)可以先再別的地方搞清楚如何循環(huán),再下手編寫(xiě)痰憎。