思想:两两相邻元素比较,不满足顺序就交换,满足顺序就找下一对
升序代码:
void Bubble_sort(int* a, int len)
{ //每一轮将最大的排到最后,n个元素需要n-1轮
for (int i = 0; i < len - 1; i++)
{ //i轮后i个已经排好就不用再两两比较了
for (int j = 0; j < len - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;//注意这里最后是写temp不要又写成a[j]
}
}
}
}
int main()
{
int arr[10]={ 9,2,34,8,3,1,14,6,17,71};
int len = sizeof(arr)/sizeof(arr[0]);//求数组的长度要记得除以每一个数组元素的大小
Bubble_sort(arr, len);
for (int i = 0; i
如果想要降序把a[j]和a[j+1]的比较条件改一下
对冒泡排序内部的代码优化
void Bubble_sort(int* a, int len)
{
bool flag = true;
for (int i = 0; i < len - 1&&flag; i++)
{
flag = false;//假设当前序列已经完成排序
for (int j = 0; j < len - 1 - i; j++)
{
if (a[j] > a[j + 1])//如果不执行该if里的语句,则代表排序已经完成,外层i循环不再执行
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = true;
}
}
}
}
思想:从小到大升序,每轮都在剩下的数里面选最小的换到前面/如果是降序就选最大的
每轮排好一个元素,总共n-1轮
升序版
int main()
{
int a[10] = { 20,27,31,18,29,38,35,12,23,14 };
int k = 0;//mark剩下的数中最小的下标
for (int i = 0; i < 9; i++)
{
k = i;
for (int j = i + 1; j < 10; j++)
{
if (a[j] < a[k])
k = j;
}
//把最小的数放到最前面
int t = a[i];
a[i] = a[k];
a[k] = t;
}
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
}
思想:依次将每个元素插入到前面有序的部分
(摸扑克牌整理的感觉)
直接插入排序
int main()
{
int a[10] = { 20,27,31,18,29,38,35,12,23,14 };
int temp = 0;
for (int i = 1; i < 10; i++)
{
temp = a[i];//用temp存a[i],独立于数组,移动的时候不会被覆盖仍然可以取出进行比较
for (int j = i - 1; j >= 0; j--)//倒着比较
{
if (temp < a[j])
{
a[j + 1] = a[j];
a[j] = temp;
}
}
}
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
}
Example: 将两个已排序(升序)的数组a、b,合并后存放再另一个数组c中,且合并后的数列也是有序数列
思想:
首先各取数组a和b的第1个元素进行比较,将较小元素存为数组c的第1个元素;
接着取刚才比较中较小元素所在数组的下一个元素,与另一数组中刚才比较中的较大元素进行比较,将本次的较小元素存为数组c的第2个元素; …
重复上述比较过程,直到某一个数组先比较完; //先比完说明另一个没比完的数组中剩下的数都比xx更大,所以只需要将另一个数组中未比完的元素依次存入C数组的后续元素中,即完成有序数组的合并。
int main()
{
int i=0, j=0, k = 0;
int a[5] = { 1,3,5,7,9 };
int b[7] = { 2,4,6,8,10,12,14 };
int c[12];
while (i <= 4 && j <= 6)
{
if (a[i] > b[j])
{
c[k] = b[j];
k++;
j++;
}
else
{
c[k] = a[i];
k++;
i++;
}
}
if (i <= 4)
{
for (int p = i; p <= 4; p++)
{
c[k] = a[p];
k++;
}
}
else
{
for (int p = j; p <= 6; p++)
{
c[k] = b[p];
k++;
}
}
for (int p = 0; p < 12; p++)
printf("%d ", c[p]);
}