几大排序方法比较
- 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
- 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
- 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
- 空间复杂度:是指算法在计算机
一、选择排序(Selection Sort)
具体算法:
①初始状态:无序区为R[1…n],有序区为空;
②第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
③n-1趟结束,数组有序化了。
动图演示:
- 第一种(from“正月点灯笼”)
原理是:
把找出待排序里的最大值,挪动到最右边,然后待排序数组的长度-1
int findMaxPos(int arr[], int n)
{
int max = arr[0];//假设arr[0]为最大
int pos = 0; //数组的最大值下标
int i;
for (i = 0;i < n;i++)
{
if (arr[i] > max) //如果发现有更大的数
{
max = arr[i]; //记录最大值
pos = i; //记住该数组的最大值下标
}
}
return pos;
}
void selectionSort(int arr[], int n)
{
while (n > 1)
{
//在arr[]数组里找到最大值的下标
int pos = findMaxPos(arr, n);
//找到之后,与数组最后一位交换(arr[n - 1])
int temp = arr[pos];
arr[pos] = arr[n - 1];
arr[n - 1] = temp;
n--; //待排序数组长度-1
}
}
int main()
{
int arr[] = {
5,8,9,7,6,1,2,4,3 };
selectionSort(arr, 9);
int i;
for (i = 0;i < 9;i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
- 第二种(from“merely尘埃”)
找出待排序的数组的最小值,挪动到待排序数组的最左端(k=i代表每组待排序数组开始时候的最左端)
void SelectSort(int a[]) //选择排序
{
int i,j,k,temp;
int n; //代表数组的长度
for(i = 1;i<=n;i++) //进行n趟操作
{
k = i; //每一组没有排序的组合的开端
for(j = i;j<=n;j++) //选出[i , n] 中最小的元素,下标为k
{
//选出来的新元素将会比以及排好序的部分都大
if(a[j] < a[k])
k = j;
}
temp = a[i]; //交换a[k]与a[i]
a[i] = a[k];
a[k] = temp;
}
}
二、插入排序(Insertion Sort)
动图演示:
- 第一种(form“merely尘埃”)
int A[maxn],n; //n为元素个数
void insertSort()
{
int i,j,k,temp;
for(i = 1