冒泡排序;选择排序;插入排序;快排;判断大小端;位运算

1.冒泡排序:基础        时间复杂度来说:o(n^2)

从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

#include 

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 str[i+1])
            {
                tmp = str[i];
                str[i] = str[i+1];
                str[i+1] = tmp;
            }
        }
    }
    
    printf("排序后:");
    for(i=0; i

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

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; j0 && 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 
 
int main(void)
{
	int num = 0x11223344;
	if (0x44 == *(char *)&num)
	{
		printf("小端!\n");
	}
	else if (0x11 == *(char *)&num)
	{
		printf("大端!\n");
	}
 
	return 0;
}

使用联合体结构

#include 
 
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 
 
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;
}

你可能感兴趣的:(算法,排序算法,数据结构)