排序的稳定性:有跳跃式的交换数据就不稳定。例:1 3(1) 4 3(2)
若排序后 :1 3(1) 3(2) 4 稳定 1 3(2) 3(1) 4 不稳定
以下均以增序为例
1、直接插入排序 : 把一个新的数据插入到一个已经有序的数列中。
适用于:基本有序、数据量小。
代码:
void Insert(int *arr,int len)
{
int tmp = 0;
for(int i = 1;i<len;i++)
{
tmp = arr[i];
for(int j = i-1;j>=0 && tmp<arr[j];j--)
{
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
}
int main()
{
int arr[] = {5,0,2,17,3,23,1,5,8,7,9,23,13,14,7};
int len = sizeof(arr)/sizeof(arr[0]);
Insert(arr,len);
for(int i = 0;i<len;i++)
printf("%d ",arr[i]);
}
2、希尔排序 : 又称”缩小增量排序“,也是属于插入排序的方法。现将整个待排序数列分割为若干个分别进行直接插入排序,
待整个数列基本有序时,再对全体记录进行一次直接插入排序。(越有序越快)
代码:
void Shellsort(int *arr,int len,int n)
{
int tmp = 0;
for(int i = n;i<len;i++)
{
tmp = arr[i];
for(int j = i-n;j>=0&&tmp<arr[j];j = j-n )
{
arr[j+n] = arr[j];
arr[j] = tmp;
}
}
}
int main()
{
int arr[] = {0,2,4,6,18,5,38,23,3,7,1,9,23,47,67,53,19,27};
int str[] = {5,2,1};
int len = sizeof(arr)/sizeof(arr[0]);
int n = sizeof(str)/sizeof(str[0]);
for(int i = 0;i<n;i++)
Shellsort(arr,len ,str[i]);
for(int k = 0;k<len;k++)
printf("%d ",arr[k]);
}
3、冒泡排序 : 一次对两个元素进行比较,若后者小于前者则进行交换,重复此过程直至数列有序。
代码:
void Bubblesort(int *arr,int len)
{
int tmp = 0;
for(int i = 0;i<len-1;i++)
{
for(int j = 0;j<len-i-1;j++)
{
if(arr[j]>arr[j+1])
{
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
int main()
{
int arr[] = {0,1,1,9,7,3,4,5,7,5};
int len = sizeof(arr)/sizeof(arr[0]);
Bubblesort(arr,len);
for(int i = 0;i<len;i++)
printf("%d ",arr[i]);
}
4、简单选择排序 :通过 n-i 次 关键字间的比较,从 n-i-1 个记录中选出关键字最小的记录,并和第 i 个记录交换。
代码:
void Selectsort(int arr[],int len)
{
int i,j;
int tmp = 0;
int count = 0;
for(i = 0;i<len-1;i++)
{
count = i;
for(j = i+1;j<len-1;j++)
{
if(arr[j]<arr[count])
{
count = j;
}
}
if(i != count)
{
tmp = arr[i];
arr[i] = arr[count];
arr[count] = tmp;
}
}
}
int main()
{
int arr[] = {0,9,3,4,2,7,5,8,6,10};
int len = sizeof(arr)/sizeof(arr[0]);
Selectsort(arr,len);
for(int i = 0;i<len;i++)
printf("%d ",arr[i]);
}
5、堆排序
大根堆 : 父节点数据大于节点数据。 根据父节点找子节点: 左 2*i 右 2*i+1
整个堆数据的长度len : len/2 最后一个父节点的位置。
小根堆
代码:
void Heapadjust(int arr[],int n ,int len)
{
int max = arr[n];
for(int j = 2*n;j<=len;j = j*2)
{
if(arr[j]<arr[j+1]&&j<len)
{
j++;
}
if(arr[j]<max)
{
break;
}
arr[n] = arr[j];
arr[j] = max;
n =j;
}
}
void Heapsort(int *arr,int len)
{
for(int i=len/2;i>0;i--)
{
Heapadjust(arr,i,len-1);
}
for(int j = len-1;j>0;j--)
{
int tmp = arr[1];
arr[1] = arr[j];
arr[j] = tmp;
Heapadjust(arr, 1, j-1);
}
}
int main()
{
int arr[] = {-1,0,2,9,8,3,6,7,1,5,4};
int len = sizeof(arr)/sizeof(arr[0]);
Heapsort(arr,len);
for(int i = 0;i<len;i++)
printf("%d ",arr[i]);
}