1.冒泡排序:基础 时间复杂度来说:o(n^2)
从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
#include <stdio.h>
int main(void)
{
int str[32] = 0;
int i = 0;
int j = 0;
int len = sizeof(str) / sizeof(str[0]);
int tmp = 0;
for(i=0; i<len; i++)
{
scanf("%d", &str[i]);
}
printf("排序前:");
for(i=0; i<len; i++)
{
printf("%d", str[i]);
}
printf("\n");
for(j=0; j<len-1; j++)
{
for(i=0;i<len-i-1; i++)
{
if(str[i] > str[i+1])
{
tmp = str[i];
str[i] = str[i+1];
str[i+1] = tmp;
}
}
}
printf("排序后:");
for(i=0; i<len; i++)
{
printf("%d", str[i]);
}
printf("\n");
return 0;
}
2.选择排序:交换次数少;交换的数据所占空间较大时适用 时间复杂度来说:o(n^2)
假设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最小的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int t = 0;
int a[10] = {0};
printf("请输入10个整数:\n");
for(i=0; i<10; i++)
{
scanf("%d",&a[i]); //输入10个整数存到数组里
}
for(i=0; i<9; i++)
{
for(j=i+1; j<10; j++)
{
if(a[i] > a[j]) //如果前一个数比后一个大,则调换值
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
for(i=0; i<10; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
3.插入排序:已近有序的数据使用插入排序,时间复杂度为o(n)
int InsertSort(int *pArray, int MaxLen)
{
int i = 0;
int j = 0;
int tmp = 0;
for(j=1; j<MaxLen; j++)
{
tmp = pArray[j];
for(i=j; i>0 && tmp < pArray[i-1]; i--)
{
pArray[i] = pArray[i-1];
}
pArray[i] = tmp;
}
return 0;
}
4.快排
选一个key值(选第一个值),从后面选一个比其小的值,从前面选一个比其大的值,key值放中间
int QuickSort(int *pArray, int Low, int High)
{
int key = 0;
int i = Low;
int j = High;
key = pArray[Low];
while(i < j)
{
while(i < j && pArray[j] >= key)
{
j--;
}
pArray[i] = pArray[j];
while(i < j && pArray[i] <= key)
{
i++;
}
pArray[j] = pArray[i];
}
pArray[i] = key;
if(i-1 > Low)
{
QuickSort(pArray, Low, i-1);
}
if(i+1 < High)
{
QuickSort(pArray, i+1, High);
}
return 0;
}
5.判断大小端
测试一个硬件平台是大端平台?小端平台?
1.小端:内存低地址存放低数据位称为内存小端
2.大端:内存低地址存放高数据位称为内存大端
#include <stdio.h>
int main(void)
{
int num = 0x11223344;
if (0x44 == *(char *)&num)
{
printf("小端!\n");
}
else if (0x11 == *(char *)&num)
{
printf("大端!\n");
}
return 0;
}
使用联合体结构
#include <stdio.h>
union s
{
char a;
int b;
};
int main(void)
{
union s s1;
s1.b = 1;
if (s1.a)
{
printf("小端!\n");
}
else
{
printf("大端!\n");
}
return 0;
}
6.位运算
位运算:
& 按位与
| 按位或
^ 按位异或 相同为0 相异为1
~ 按位取反
<< 左移
>> 右移 让数据缩小 num /= 2 ^ n
& 0得0
| 1置1
不改变其余位的前提下,让第n位置1
int num: 1110 1011
num = num | (1 << n);
不改变其余位的前提下,让第n位置0
int num:1110 1011
num = num & (~(1 << n));
^ 实现两个数的交换
进行数据置换:
#include <stdio.h>
int main(void)
{
int a = 100;
int b = 200;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d\n", a, b);
return 0;
}