直接插入排序
1.基本思想:直接插入排序是一种简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的,记录数加1的有序表。
我们以整形数组为例,则上面说的记录可以理解成整形数据。当数组中只有一个元素时,则数组已然有序。若数组有多个元素,则从第二个元素开始依次查找待插入的位置,并将待插入的位置与元素位置之前的元素向后移动,然后将待插入的元素插入对应的位置。
2.例子
有数据如下:
12, 9, 38, 6, 25, 14, 3
共7个元素,假设我们已经按升序排好了前三个元素,即此时序列变为
9, 12, 38, 6, 25, 14, 3
此时我们需将6插入前三个有序数据中,插入过程如下
初始状态:9, 12, 38, 6
1. 9, 12, 6, 38
2. 9, 6, 12, 38
3. 6, 9, 12, 38
其它元素采用同样的方法进行排序。最坏情况下,有n-1个元素需进行插入,记录的移动次数为n(n-1)/2,故时间复杂度为O(n^2);
3.C语言代码
void InsertSort(int arr[], int size)
{
int i = 1; //第1个元素有序,待插入的元素从下标为1的位置开始
for (; i < size; i++)
{
int end = i - 1;
int key = arr[i]; //将第i个元素记录下来,防止元素后移导致第i个元素丢失
//end>=0防止数组下标越界
while (end >= 0 && key < arr[end])
{
arr[end + 1] = arr[end];
end--;
}
arr[end + 1] = key;
}
}
冒泡排序
1.基本思想 将第一个数据和第二个数据进行比较,若第一个数据大于第二个,则交换之(升序)。然后比较第二个数据和第三个数据,依次类推,直至第n-1个记录和第n个记录进行比较。上述过程称为一趟冒泡排序。第一趟冒泡排序把最大的元素放入第n个记录的位置,第二趟对前n-1个元素进行冒泡排序,把次大的元素放入第n-1个记录的的位置,依次类推,直到把所有的元素排好序。
2.例子
初始状态:<12, 9>, 38, 6, 25, 14, 3
1.9, <12, 38>, 6, 25, 14, 3
2.9, 12, <38, 6>, 25, 14, 3
3.9, 12, 6,< 38, 25>, 14, 3
4. 9, 12, 6, 25, <38, 14>, 3
5. 9, 12, 6, 25, 14,< 38, 3>
6. 9, 12, 6, 25, 14, 3, 38
3.C语言代码
void BubbleSort(int *arr, int size)
{
int i, j;
for (i = 0; i < size - 1; i++)
{
int flag = 0;
for (j = 0; j < size - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
Swap(&arr[j], &arr[j + 1]);
flag = 1;
}
}
if (0 == flag)//若某趟排序已使整个数组有序则结束
return;
}
}
void Swap(int *left, int *right)
{
int tmp = *left;
*left = *right;
*right = tmp;
}