排序算法分为内部排序和外部排序:
外部排序:当文件较大,以至于内存不足以存放全部记录,需要借助外存的访问。
内部排序:适合 小文件。一般分为插入排序,选择排序,交换排序,归并排序,基数排序等。
稳定与不稳定:
对于在原始文件中,如果第i个数据等于第j个数据,且i>j,当排序之后如果i>j,那么称算法为稳定的,否则就是不稳定的。
插入排序
插入排序就是将待排序的算法分为两个区域,一个是有序区域,另一个是无序区域。每次将无序区域的第一个记录按照关键字值得大小插入到有序区域,直到全部变成无序区域位置。
直接插入排序(稳定)
直接插入排序的具体做法是在插入第i个记录时,r1,r2…ri-1.已经排好序。这时将ri依次与关键字ri-1,ri-2,…r1进行比较,从而找到应该插入的点。
第一种最原始的做法
template<typename T>
void direct_insert_sort(T* array,int length)
{
int i = 0;
int j = 0;
int k = 0;
T temp;
for (i = 1; i<length; i++) /*i从1到length-1,因为第一个元素可以看做排好序,i就是需要插入的元素的编号 */
{
for (j = 0; j<i; j++)/*j从0到i-1,这个区域就是排好序的区域,从后往前进行遍历 */
{
/*当array[i]>=array[j] 时,表示需要插入的元素大于等于已排序部分的遍历的当前值*/
if (array[i]>=array[j])
continue;/*此时j继续后移,直到找到第一个array[i]<array[j] */
else
{
temp = array[i];/*下面的部分为将[j+1:i] */
for (k = i; k>j; k--)
{
array[k] = array[k - 1];
}
array[j] = temp;
}
}
}
}
第二种的做法
template<typename T>
void direct_insert_sort(T *array, int length)
{
int i=0;int j=0;
T temp;
for(i=1;i<length;i++)
{
temp = array[i];
j = i - 1;
while (array[j]>temp)
{
array[j + 1] = array[j];/*从J=i-1开始,如果array[i]<array[j],那么将array[j] */
j--;
}
array[j + 1] = temp;
}
}
希尔排序(不稳定)
缩小增量排序
void shellsort2(int *v, int n)
{
int gap, i, j, k,temp;
/*每一种步长*/
for (gap = n / 2; gap > 0; gap /= 2)
{
/*当前选择步长的每一个起始位置*/
for (i = 0; i <gap; i++)
{
/*第二种直接插入排序,只不过步长由1变成了gap*/
for (j = i + gap; j < n; j = j + gap)
{
temp = v[j];
k = j - gap;
while (v[k]>temp)
{
v[k+gap] = v[k];
k=k-gap;
}
v[k + gap] = temp;
}
}
}
}