选择排序法
从小到大排序的核心
for (i = 0; i < n - 1; i++)//选择排序法从小到大排序的核心步骤
{
index = i;//index从第一项开始
for (j = i + 1; j < n; j++)//枚举
{
if (a[i] < a[index])
{
index = i;
}
}
temp = a[index];//交换
a[index] = a[i];
a[i] = temp;
}
从大到小排序的核心
for (i = 0; i < n - 1; i++)//选择排序法从小到大排序的核心步骤
{
index = i;//index从第一项开始
for (j = i + 1; j < n; j++)//枚举
{
if (a[i] > a[index])//改变这里即可
{
index = i;
}
}
temp = a[index];//交换
a[index] = a[i];
a[i] = temp;
}
冒泡排序
从小到大排序的核心
for (i = 1; i < n; i++)//外循环只需要进行n-1次即可
{
for (j = 0; j < n - 1; j++)//内循环也只需要进行n-1次
{
if (a[j] > a[j + 1])//枚举,依次比较前后两项,将最大项放在最后面
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
从大到小排序的核心
for (i = 1; i < n; i++)//外循环只需要进行n-1次即可
{
for (j = 0; j < n - 1; j++)//内循环也只需要进行n-1次
{
if (a[j] < a[j + 1])//枚举,依次比较前后两项,将最小项放在最后面
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
数组循环移动
法一、利用新的数组
int i;
int b[100];//n是数组的大小,m是右移的位数
for (i = 0; i < n; i++)
{
b[i] = a[i];
m = m % n;
for (i = 0; i < n; i++)
{
a[(i + m) % n] = b[i];
}
}
法二、直接在原数组的基础上修改
循环右移核心
int i, j;
int x; //n是数组的大小,m是右移的位数
for (i = 0; i < m; i++)//外循环控制移动次数
{
x = a[n - 1];//将最后 一个数据储存起来
for (j = n - 1; j > 0; j--)
{
a[j] = a[j - 1];//依次右移
}
a[0] = x;//将最后一项移到最前面
}
循环左移核心
int i, j;
int x; //n是数组的大小,m是右移的位数
for (i = 0; i < m; i++)//外循环控制移动次数
{
x = a[0];//将第一个数据储存起来
for (j = 0; j <n; j++)
{
a[j] = a[j + 1];//依次左移
}
a[n-1] = x;//将第一项移到最后面
}
数组逆序输出
法一、for循环核心
int i, j,temp;//temp常作为交换数据的一个中间变量
for (i = 0, j = size - 1; i < j; i++, j--)//size为数组的大小
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
法二、未知size的情况,逆序输出核心
int i = 0, j;
char a[max];//max为数组的大小
gets(a);//将数组赋值
for (i = 0; a[i]; i++);//获得素组的大小(其中包含了\0)
for (j = i - 1; j > 0; j--);//逆序输出
{
printf("%c", a[j]);
}
法三、指针交换法
#include<stdio.h>
#include <string.h>
int main()
{
char arr[1000] = { 0 };
int len = strlen(arr);
char* left = arr;
char* right = arr + len - 1;
while (left < right)
{
char* temp = left;
*left = *right;
left++;
right--;
}
printf("%s\n", arr);
return 0;
}
法四、直接交换法
#include <stdio.h>
#include <string.h>
#define MAX 1000
int main()
{
char arr[MAX];
int left = 0;
int right = strlen(arr) - 1;
while (left < right)
{
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
printf("%s\n", arr);
return 0;
}
数组删除重复元素
例题如下:
代码解析:
#include <stdio.h>
#define MAX 100
int main()
{
int j, i, m, x, index, temp;
char a[MAX];
i = 0;
while ((a[i] = getchar()) != '\n')
{
i++;
}
a[i] = '\0';
for (i = 0; a[i] != '\0'; i++)
{
for (j = i + 1; a[j] != '\0'; j++)
{
if (a[i] == a[j])
{
for (m = i; a[m] != '\0'; m++)
{
a[m] = a[m + 1];//如果前后有相同的元素,将见面的一项直接覆盖
}
j = i;//在往后面继续检验是否还有相同的
}
}
}
for (i = 0; a[i] != '\0'; i++)
{
index = i;
for (j = i + 1; a[j] != '\0'; j++)
{
if (a[index] > a[j])
{
index = j;
}
}
temp = a[index]; a[index] = a[i]; a[i] = temp;//进行排序
}
for (i = 0; a[i] != '\0'; i++)
{
putchar(a[i]);
}
putchar('\n');
return 0;
}