1、冒泡排序
cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
//冒泡排序
void bubblesort(int q[],int N)
{
int temp = 0;
for(int i = 0;i<N-1;i++)
{
for(int j = 0;j<N-i-1;j++)
{
if(q[j]>=q[j+1]) //注意这里不要写成j++
{
temp = q[j];
q[j] = q[j+1];
q[j+1] = temp;
}
}
}
}
int main()
{
int q[5] = {100,500,10,30,455};
int n = sizeof(q) / sizeof(int);
bubblesort(q,5);
for(int i = 0;i<n;i++)
{
printf("%d ",q[i]);
}
return 0;
}
2、选择排序
外层大循环是n-1次 (因为是两两对比)
内层小循环是从第二个元素开始
思路:将当前未排序区间的第一个元素,设置为最小值
然后从第二个元素开始对比,然后将对比出的最小值,与这个区间的第一个元素交换即可
cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
//冒泡排序
void selectsort(int q[],int N)
{
int minIndex = 0;
int temp;
for(int i = 0;i<N-1;i++)
{
//假设未排序区间第一个元素是最小值
minIndex = i;
//从第二个元素开始对比
for(int j = i+1;j<N;j++)
{
if(q[j]<q[minIndex])
{
minIndex = j;
}
}
// 将找到的最小值与未排序区间的第一个元素交换
temp = q[minIndex];
q[minIndex] = q[i];
q[i] = temp;
}
}
int main()
{
int q[5] = {1,500,10,30,455};
int n = sizeof(q) / sizeof(int);
selectsort(q,5);
for(int i = 0;i<n;i++)
{
printf("%d ",q[i]);
}
return 0;
}
3、插入排序
思路:将数组分为'已排序区间'和'未排序区间',每次从未排序区间取一个元素,插入到已排序区间的合适位置,直到所有元素排序完成
默认第一个元素已排序,从第二个元素开始
设立一个下标 J , 表示已排序区间的最后一位
如果 J 的值 大于当前要比较的值,那么我们将 q【j】这一位往后移,同时 j-- ,继续向前比较
如果不用再比较了,那么直接让q[j+1]这一位原来的 q【j】 的值变成current的值即可
cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
//插入排序
void insertsort(int q[],int n)
{
int i,j,current;
//未排序区间的第一个元素(从1开始,0号元素默认已排序)
for(i=1;i<n;i++)
{
current = q[i];
j = i-1; //j是已排序区间末尾下标
//内层循环
while(j>=0 && q[j] > current)
{
q[j+1] = q[j]; //元素后移一位
j--; //继续向前比较
}
// 将current插入到正确位置(j+1是插入索引)
q[j+1] = current;
}
}
int main()
{
int q[5] = {1,500,1022,30,455};
int len = sizeof(q) / sizeof(q[0]);
insertsort(q,len);
for(int i = 0;i<len;i++)
{
printf("%d ",q[i]);
}
return 0;
}