冒泡排序:最简单的一种排序算法。先从数组中找到最大值(或最小值)并放到数组最左端(或最右端),然后在剩下的数字中找到次大值(或次小值),
以此类推,直到数组有序排列。算法的时间复杂度为O(n^2)。
for (int i=0;i<10;i++)
{
for (int j=i+1;j<10;j++)
{
if (a[i]>a[j])
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for (int i=0;i<10;i++)
{
for (int j=9;j>=i+1;j--)
{
if (a[j-1]>a[j])
{
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
}
第二种应该是正统的,符合那个逻辑流程的冒泡排序
2、选择排序
严蔚敏版《数据结构》中对选择排序的基本思想描述为:每一趟在n-i+1(i=1,2,...,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
具体来说,假设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组的最左端(也就是min1不等于arr[0]),
则将最小值min1和arr[0]交换,接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr[1],则交换这两个数字,依次类推,直到数组arr有序排列。
算法的时间复杂度为O(n^2)。
int a[10] = { 5,6,9,8,9,6,3,5,1,3 };
int temp = -1;
int index = 0;
for (int i=0;i<10;i++)
{
index = i;
temp = a[i];//每次进入排序的时候,假设自己为最小的
for (int j=i+1;j<10;j++)
{
if (temp>a[j])
{
index = j;//如果发现自己不是最小的,那么就记录这个值,和下标的值
temp = a[j];
}
}
a[index] = a[i];
a[i] = temp;//互相交换值
}
for (int i=0;i<10;i++)
{
cout << a[i] << " ";
}
3.插入排序的基本思想就是将无序序列插入到有序序列中。例如要将数组arr=[4,2,8,0,5,1]排序,可以将4看做是一个有序序列(图中用蓝色标出),
将[2,8,0,5,1]看做一个无序序列。无序序列中2比4小,于是将2插入到4的左边,此时有序序列变成了[2,4],无序序列变成了[8,0,5,1]。无序序列中8比4大
,于是将8插入到4的右边,有序序列变成了[2,4,8],无序序列变成了[0,5,1]。以此类推,最终数组按照从小到大排序。该算法的时间复杂度为O(n^2)。
这是我初步写的,算是半成品的插入排序吧,
for (int i=1;i<10;i++)//新插入的i下标
{
for (int j=0;j<i;j++)//已经拍好序的部分,初始是第一位0假设排好序了
{
if (a[i]<a[j])
{
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
printf("\n");
}
下面这个才是符合插入排序逻辑的插入排序:
int a[10] = { 8,9,6,3,5,7,1,2,4,0};
int temp = -1;
int index = 0;
for (int i=1;i<10;i++)
{
temp = a[i];//要插入的数
for (index =i-1; index >=0; index--)
{
if (temp<a[index])
{
a[index + 1] = a[index];
}
else
{
break;
}
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
printf("\n");
}
a[index + 1] = temp;
}
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
printf("\n");