交换类排序


1. 交换两个数

1.1 临时变量

		swap(int *pa, int *pb)
		{
			int tmp = 0;
			
			tmp = *pa;
			*pa = *pb;
			*pb = tmp;
		}

1.2 赋值运算————大数容易溢出

		swap(int *pa, int *pb)
		{				
			*pa = *pa + *pb;
			*pb = *pa - *pb;
			*pa = *pa - *pb;
		}

1.3 位运算

		swap(int *pa, int *pb)
		{				
			*pa = *pa ^ *pb;
			*pb = *pa ^ *pb;
			*pa = *pa ^ *pb;
		}
		
		swap(int *pa, int *pb)
		{				
			*pa ^= *pb;
			*pb ^= *pa;
			*pa ^= *pb;
		}

1.4 注释:

		左值: 写权限
		右值: 只读权限

2. 冒泡排序

1. What:

  • 无序区的元素中,
  • 比较相邻元素的关键字对应的值,
  • 交换那些不满足次序要求的偶对,直到全部满足为止。

2.How:

		static void BubbleSort (int A[], int n)
		{
			int	i 		 = 0;
			int	j 		 = 0;
			int exchange = 0;
			
			for (i = 0; i < n-1; ++i)		/* n 个数最多需要 n-1 趟排序才能满足次序的要求 */
			{
				exchange = 0;				/* 经过一趟排序后, 检查相邻的元素是否发生过交换 */		
				for (j = n-1; j > i; --j)	/* 从后往前两两比较相邻的元素, 每趟比较后使得一个元素归位。*/
				{
					if (A[j-1] > A[j])
					{
						swap(&A[j-1], &A[j]);
						exchange = 1;
					}
				}
				
				if (0 == exchange)
				{
					return ;
				}
			}
		}

3.Why:

  • 每一趟排序使得一个元素归位,有序区的元素一定小于(顺序)[大于(逆序)]无序区的元素,因此是全局有序的。
  • A[j-1] > A[j] 保证了冒泡排序算法的稳定性。
  • j > i 保证每次的比较都在无序区。