# 排序算法（一）

（一）冒泡排序：

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void bottle_sort(int arr[], int len)
{
int i = 0;
int j = 0;
if (len <= 0)
{
printf("数组长度不合理\n");
exit(EXIT_FAILURE);
}
for (i = 0;i < len - 1;i++)
{
for (j = 0;j < len - i - 1;j++)
{

if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;

}
}
}
}
int main()
{
int arr[5] = {5,6,3,2,1};
int i = 0;
bottle_sort(arr,5);
for (i = 0;i < 5;i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}

<pre name="code" class="cpp">void bottle_sort(int arr[], int len)
{
int i = 0;
int j = 0;
int flag = 0;
if (len <= 0)
{
printf("数组长度不合理\n");
exit(EXIT_FAILURE);
}
for (i = 0;i < len - 1;i++)
{
flag = 0;
for (j = 0;j < len - i - 1;j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 1;
}
}
if (flag == 0)
{
break;
}
}
}

void bottle_sort(int arr[], int len)
{
int i = 0;
int j = 0;
if (len <= 0)
{
printf("数组长度不合理\n");
exit(EXIT_FAILURE);
}
int k = len - 1;
int m = 0;
for (i = 0;i < len - 1;i++)
{
for (j = 0;j < k;j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
m = j;
}//找到每一趟最后一次交换的位置
}
k = m;
}
}

int compare(const void *elem1, const void *elem2)
{
return *(const int *)elem1 - *(const int *)elem2;
}
void sort(void *base, unsigned int num,
unsigned int byte, int(*cmp)(const void *elem1, const void *elem2))
{
char *pbase = (char *)base;
int flag = 0;
int i = 0;
int j = 0;
int k = 0;
const void *p1 = NULL;
const void *p2 = NULL;
for (i = 0;i < num - 1;i++)
{
flag = 0;
for (j = 0;j < num - 1 - i;j++)
{
p1 = (const void *)(pbase + j*byte);
p2 = (const void *)(pbase + (j + 1)*byte);
int ret = cmp(p1, p2);
if (ret > 0)
{
for (k = 0;k < byte;k++)
{//交换秘诀
pbase[j*byte + k] = pbase[j*byte + k] + pbase[(j + 1)*byte + k];
pbase[(j + 1)*byte + k] = pbase[j*byte + k] - pbase[(j + 1)*byte + k];
pbase[j*byte + k] = pbase[j*byte + k] - pbase[(j + 1)*byte + k];
}
flag = 1;
}
if (flag == 0)
break;
}
}
}
int main()
{
int(*cmp)(const void *elem1, const void *elem2) = compare;
int arr[4] = { 6,7,4,2 };
int i = 0;
sort(arr,4,4,cmp);
for (i = 0;i < 4;i++)
{
printf("%d ",arr[i]);
}
system("pause");
return 0;
}  

（二）选择排序

void select_sort(int arr[], int len)
{
if (len <= 0)
{
printf("数组长度不合理\n");
exit(EXIT_FAILURE);
}
int i = 0;
int j = 0;
int min = 0;//保存固定范围的最小值得下标
for (i = 0;i < len - 1;i++)
{
min = i;
for (j = i + 1;j < len;j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
if (i != min)//如果这个位置放的不是最小数，需要交换
{
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
}

i控制的是找到的最小元素放的位置，j控制的是找最小元的范围（图片中 绿色竖线后

（三）直接插入排序：

void insert_sort(int arr[], int len)
{
if (len <= 0)
{
printf("数组长度不合理\n");
exit(EXIT_FAILURE);
}
int i = 0;
int j = 0;
int tmp = 0;
int k = 0;
for (i = 1;i < len;i++)
{
tmp = arr[i];
for (j = i - 1;j >= 0;j--)
{
if (arr[j] <= arr[i])
break;
}
for (k = i - 1;k > j;k--)
{
arr[k + 1] = arr[k];
}
arr[j+1] = tmp;
}
}

tmp用来存储需要处理的数。内层第一个循环的作用是找出合适的位置，即就是找到比

void insert_sort(int arr[], int len)
{
if (len <= 0)
{
printf("数组长度不合理\n");
exit(EXIT_FAILURE);
}
int i = 0;
int j = 0;
int tmp = 0;
for (i = 1;i < len;i++)
{
tmp = arr[i];
for (j = i-1;(j >= 0) && (arr[j]>tmp);j--)//当要处理的元素比前边的元素小并且j还是大于等于0，
//就要发生移位
{
arr[j+1] = arr[j];
}//循环结束，j下标的元素是刚好小于要处理的元素(不满足arr[j]>tmp)或者是j=-1（不满足j>=0）
arr[j + 1] = tmp;//将要处理的元素放在上次j的下一个位置
}
}

void insert_sort(int arr[], int len)
{
if (len <= 0)
{
printf("数组长度不合理\n");
exit(EXIT_FAILURE);
}
int i = 0;
int j = 0;
int tmp = 0;
int m = 0;
for (i = 1;i < len;i++)
{
tmp = arr[i];
for (j = i - 1;(j >= 0) && (arr[j]>tmp);j--)
{
m = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = m;
}
}
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：排序算法（一） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)