冒泡排序
#include <stdio.h>
/*
思想:将数组中的数据从小到大排序,这里使用双重for循环,第一个for循环控制从哪里到哪里,第二个for循环是对这个范围内的数据进行逐个比较。
*/
void BubbleSort(int arr[],int len)
{
int i,j;
int temp;
for(i = len - 1; i > 0; i--) //从最后一个开始比较,依次类推,每次一轮结束都会有一个数确定了它的位置。
{
for(j = 0; j < i ; j++) //从0开始逐个比较一直比较到i,这里说比较到i是因为下面有一个j++,其实到i的前一个。
{
if(arr[j] > arr[j+1]) //如果当前值比后一个大则换位置
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main()
{
int array[10] = {
3, 90, 43, 5, 65, 23, 12, 34, 6, 8};
BubbleSort(array,10);
for(int i = 0; i < 10; i++)
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}
插入排序
#include <stdio.h>
/*
思想:插入排序是默认第一个数是有序的,然后从第二个数开始与之前的数进行比较,这里需要注意
是与之前的数进行比较,所以在第一个for循环中,就要与前面的进行比较,一直比较到第一个数,
但是最后比较到第一个数之后,又进行了j--,这里需要在后面再加上,然后将值赋给这个位置。
*/
void InsertionSort(int *arr,int len)
{
int i,j,temp;
for(i = 1; i < len; i++)
{
if(arr[i] < arr[i-1])
{
temp = arr[i];
for(j = i - 1; j >= 0 && arr[j] > temp; j--) //j不仅仅要大于等于0,还要大于temp。这个循环就是比较大小然后挪位置的。
{
arr[j+1] = arr[j];
}
arr[j+1] = temp; //这步因为上面for循环多执行异步j--,所以这里要j+1。
}
}
}
int main()
{
int array[10] = {
3, 90, 43, 5, 65, 23, 12, 34, 6, 8};
InsertionSort(array,10);
for(int i = 0; i < 10; i++)
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}
选择排序
#include <stdio.h>
void SelectionSort(int *arr,int len)
{
int i,j,k,temp;
for(i = 0; i < len - 1; i++) //从第一个数开始
{
k = i; //先copy一份位置
for(j = i + 1; j < len; j++) //从i后面的数开始比较
{
if(arr[j] < arr[k]) //如果比较的数比arr[k]位置的数据小,就先把j的数据赋值给k,等循环结束,会有一个最小的值得出,后面再和i进行互换。
{
k = j;
}
}
temp = arr[k];
arr[k] = arr[i];
arr[i] = temp;
}
}
int main()
{
int array[10] = {
3, 90, 43, 5, 65, 23, 12, 34, 6, 8};
SelectionSort(array,10);
for(int i = 0; i < 10; i++)
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}
希尔排序
#include <stdio.h>
/*
*/
void ShellSort(int *arr,int len)
{
int i,j,k,temp,gap; //gap是步长
for(gap = len / 2; gap > 0; gap /= 2) //这里就是按一定步长分开,把这写数据不断拆分,指导拆分为1个个单独的数据
{
for(i = 0; i < gap; i++) //数据中的第一个数
{
for(j = i + gap; j < len; j += gap) //拆分之后每组数据的第一个数据
{
temp = arr[j]; //这里就和插入排序类似了,默认第一组第一个数是有序的,这里把这个比较的数先copy一份。
k = j - gap; //这里就是看j的前一个相对位置的数据
while(k >= 0 && arr[k] > temp) //这里是挨个做比较。和插入排序差不多
{
arr[k + gap] = arr[k];
k -= gap;
}
arr[k + gap] = temp; //这里也和插入排序同理
}
}
}
}
int main()
{
int array[10] = {
3, 90, 43, 5, 65, 23, 12, 34, 6, 8};
ShellSort(array,10);
for(int i = 0; i < 10; i++)
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}