思路:在进行冒泡法排序(升序)时,需要将数组元素(len)两两比较,如果
前面的元素大于后面的元素,则交换两个数,否则,比较下一个元素和它的下一个元素的大小,依次执行,执行一次循环,可以找到当前数组中最大的一个元素,然后问题规模变小,然后找出len-1个元素里的最大值,使之成为第二大元素,依次执行,需要在外层嵌套一层循环。优化:考虑如果数组中的数据已经是排好序的,那么就不需要遍历那么多次,定义一个标志位,如果没有执行交换,则说明数组中的元素已经排好序了,这时直接跳出循环。
//用冒泡法排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void swap(int *x,int *y)
{
assert(x);
assert(y);
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
void show(int *arr,int len)
{
int i = 0;
assert(arr);
for (i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
//bubble sort
void bubble_sort(int *arr,int len)
{
int j = 0;
int i = 0;
int flag = 0;
assert(arr);
for (; i < len - 1; i++)
{
for (j = 0; j < len - 1 - i; j++)//find max
{
if (arr[j] > arr[j+1])
{
flag = 1;
swap(arr+j,arr+j+1);
}
}
if (0 == flag)//如果本来就是排好序的数组,则可以利用标志位来进行优化
{
break;
}
}
}
int main()
{
int arr[]= {4300,78,45,3,8,45,798,65};
show(arr,sizeof(arr)/sizeof(int));
bubble_sort(arr,sizeof(arr)/sizeof(int));
show(arr,sizeof(arr)/sizeof(int));
system("pause");
return 0;
}
选择法排序图解:
第一种方法:
选择法排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void show(int arr[],int sz)
{
int i = 0;
assert(arr);
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void selectsort(int *arr,int sz)
{
int i = 0;
int min = 0;
assert(arr);
assert(sz > 0);
for (i = 0; i < sz; i++)
{
int j = 0;
int k = 0;
min = arr[i];
for (j = i + 1;j < sz; j++)
{
if (min > arr[j])
{
min = arr[j];//遍历一次数组找到最小值,将最小值赋给min,
//并记下此时的最小值的下标
k = j;
}
}
if (min != arr[i])//如果(arr[0])不是最小值,则将arr[0]与此时找到的最小值交换
{
arr[k] = arr[i];
arr[i] = min;
}
}
}
int main()
{
int arr[] = {9,4,5,6,2,10,6};
int len = sizeof(arr)/sizeof(arr[0]);
show(arr,len);
selectsort(arr,len);
show(arr,len);
system("pause");
return 0;
}
第二种方法:
#pragma warning(disable : 4996)
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void swap(int *x,int *y)
{
assert(x);
assert(y);
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
void selectsort(int arr[],int len)
{
assert(arr);
int i = 0;
for (i = 0; i < len; i++)
{
int minpos = i;
int j = 0;
for (j = i; j < len; j++)
{
if (arr[j] < arr[minpos])
{
minpos = j;
}
}
if (minpos != i)//如果相等,相当于用一个地址处的内容交换,一次异或之后,结果都会成为0,所以要排除掉这种情况
{
swap(&arr[i],&arr[minpos]);
}
}
}
void show(int arr[],int sz)
{
int i = 0;
assert(arr);
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {36,8,6,4,3,23,5,7,34,};
int len = sizeof(arr)/sizeof(arr[0]);
show(arr,len);
selectsort(arr,len);
show(arr,len);
system("pause");
return 0;
}