排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析。
文章规划:
一。通过自己对排序算法本身的理解,对每个方法写个小测试程序。 具体思路分析不展开描述。
二。通过《大话数据结构》一书的截图,详细分析该算法 。
在此,推荐下程杰老师的《大话数据结构》一书,当然不是打广告,只是以一名读者的身份来客观的看待这本书,确实是通俗易懂,值得一看。
三。直接插入排序
一。个人理解
直接插入排序的操作是将一个纪录插入到已经排序好的有序表中的适当位置,直到全部纪录插入为止。
(直接插入的原理:把一个标记插入到已经排好序的有序表中。如: 把arr[i]插入arr[0]---arr[i-1]中的某个位置,其中,arr[0]---arr[i-1]是排好序的。这时候从后往前,在arr[i-1]到arr[0]中找到第一次满足比arr[i]小的那个数,则把arr[i]插入这数字后面,相应的把后面的大于arr[i]的元素都往后移,则此时arr[0]----arr[i]就是有序的,如此反复,直到全部元素都找好自己的位置)
代码如下:
#include
// 打印结果
void Show(int arr[], int n)
{
int i;
for ( i=0; i
printf("%d ", arr[i]);
printf("\n");
}
//直接插入排序 按从小到大排序
void Insertsort(int arr[], int n)
{
int i, j, k;
int temp;
for (i = 1; i < n; i++)
{
//为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置,插入a[i]
for (j = i - 1; j >= 0; j--)
if (arr[j] < arr[i]) //寻找合适位置
break;
//如找到了一个合适的位置
if (j != i - 1)
{
//将比a[i]大的数据向后移
temp = arr[i];
for (k = i - 1; k > j; k--)
arr[k + 1] = arr[k];
//将a[i]放到正确位置上
arr[k + 1] = temp;
}
}
}
int main()
{ //测试数据
int arr_test[10] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };
//排序前数组序列
Show( arr_test, 10 );
Insertsort( arr_test, 10 );
//排序后数组序列
Show( arr_test, 10 );
return 0;
}
这个直接插入算法比较常规,照着算法本身的思路一步步来的,后来看了其他人的博客以及书中的写法,发现其实是可以进一步优化的。
可以把搜索arri]合适的位置和比arr[i]大的数据后移这两个步骤合并。也就是说,每次arr[i]与其前面一个数据arr[i-1]比较的时候,如果arr[i] > arr[i-1],则说明a[0]----a[i]之间都是有序的,无需调整。否则就令j=i-1,temp=arr[i]。然后一边将数据arr[j]往后移动一边向前继续搜索,直到有数据arr[j]
下面是优化后的代码。其实本质思想还是没变的。
#include
// 打印结果
void Show(int arr[], int n)
{
int i;
for ( i=0; i
printf("%d ", arr[i]);
printf("\n");
}
//直接插入排序 按从小到大排序
void Insertsort2(int arr[], int n)
{
int i, j;
int temp;
for (i = 1; i < n; i++)
if (arr[i] < arr[i-1])
{
temp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > temp; j--)
arr[j + 1] = arr[j];
arr[j + 1] = temp;
}
}
int main()
{ //测试数据
int arr_test[10] = { 8, 4, 2, 3, 5, 1, 6, 9, 0, 7 };
//排序前数组序列
Show( arr_test, 10 );
Insertsort2( arr_test, 10 );
//排序后数组序列
Show( arr_test, 10 );
return 0;
}
二。 《大话数据结构》一书截图分析
注:本文仅为分享知识,绝无商业用途。
如果以该种形式分享知识造成不必要的纠纷,还请第一时间告知。