总结10总排序算法:
①直接插入排序
②二分插入排序
③希尔排序
④直接选择排序
⑤ 堆排序
⑥冒泡排序及其改进
⑦快速排序
⑧归并排序
⑨计数排序
⑩基数排序
(PS)链表排序(插入排序,快速排序和归并排序)
应用:当数据量不大时选择插入或选择排序,不要用冒泡排序。其次,当数据量达尔优注重空间复杂度时选择快速排序和堆排序。再次,当数据量大而又允许使用较多附加空间是选择桶排序。最后,当腰在已排序数据上加若干新数据时选择(二分)插入排序。
①直接插入排序:
思想:每次将一个待排序数据对象按关键字码大小插入一个有序的数据序列中,得到一个新的容量增加一的有序数据序列,如此往复直到全部对象插入完毕为止。
数据对象在顺序表中存储,当插入第i个对象V[i]时,前面的i-1个元素V[0]、V[1]、...... 、V[i-1]已经有序。用第i个元素的关键码同已经存在的i-1个元素的关键码从后往前进行顺序比较,找到合适的位置之后就将V[i]插入,而插入点之后的元素都向后移动一位。
#include<iostream>
#include<stdlib.h>
using namespace std;
int* InsertSort(int* A, int n)
{
int InsertNum;
for (int i = 1; i < n; i++)
{
InsertNum = A[i];
int j = i;
while(j>0 && InsertNum < A[j-1])
{
A[j] = A[j - 1];
j--;
}
A[j] = InsertNum;
}
return A;
}
int main()
{
int n;
while (cin >> n)
{
int * arr = new int[n];
for (int i = 0; i < n; i++)
arr[i] = rand()%100;
InsertSort(arr, n);
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
system("pause");
return 0;
}
②二分插入排序:
二分插入排序又叫折半插入排序,它同直接插入排序一样是每次将一个数据对象插入已经排好序的顺序表中。数据对象在顺序表中存储,当插入第i个对象V[i]时,前面的i-1个元素V[0]、V[1]、...... 、V[i-1]已经有序。第i个元素的关键码用折半查找的方法在已经存在的i-1个元素的关键码中找到合适的位置之后,将V[i]插入。(优化了查找)
#include<iostream>
#include<stdlib.h>
using namespace std;
int * BinaryInsertSort(int* A, int n)
{
int mid;
for (int i = 1; i < n; i++)
{
int InsertNum = A[i];
int left = 0;
int right = i - 1;
while (left <= right)
{
mid = (left + right) / 2;
if (InsertNum > A[mid])
left = mid + 1;
else
right = mid - 1;
}
for (int j = i; j > left; j--)
A[j] = A[j - 1];
A[left] = InsertNum;
}
return A;
}
int main()
{
int n;
while (cin >> n)
{
int * arr = new int[n];
for (int i = 0; i < n; i++)
arr[i] = rand()%100;
BinaryInsertSort(arr, n);
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
system("pause");
return 0;
}
③希尔排序:
该算法先取一个小于数据表中元素个数n的整数gap,并以此为第一个间隔,将数据表分为gap个子序列,所有距离为gap的对象放在同一个系序列中。也就是把数据表中的全部元素分成了gap个组。而所有距离为gap的整数倍的记录会被放在同一个组中。分组确定后,就在每一个小组中分别进行直接插入排序。局部排序完成后,就缩小间隔gap,并重复上述步骤,直至取到gap=1时,就完成最后的一次直接插入。
#include<iostream>
#include<stdlib.h>
using namespace std;
int* ShellSort(int* A, int n)
{
int InsertNum;
int gap = n / 2;
while (gap)
{
for (int i = gap; i < n; i++)
{
InsertNum = A[i];
int j = i;
while (j >= gap && InsertNum < A[j - gap])
{
A[j] = A[j - gap];
j -= gap;
}
A[j] = InsertNum;
}
gap /= 2;
}
return A;
}
int main()
{
int n;
while (cin >> n)
{
int * arr = new int[n];
for (int i = 0; i < n; i++)
arr[i] = rand()%100;
ShellSort(arr, n);
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
system("pause");
return 0;
}