选择排序的基本思想:每一趟(例如第i趟)在后面n-i+1个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,就不用再选
简单选择排序
时间复杂度为O(n2)
/*********简单选择排序**********/
void SelectSort(int r[], int n)
{
int i, j, temp;;
int min; //最小元素的位置
for (i = 0; i < n - 1; i++)
{
min = i;
for (j = i + 1; j < n; j++)
{
if (r[j] < r[min])
min = j;
}
if (min != i)
{
temp = r[min];
r[min] = r[i];
r[i] = temp;
}
}
for (int m = 0; m < n; m++)
printf("%d ", r[m]);
}
堆排序
堆排序的时间复杂度为O(nlog2n)
/********堆排序********/
//将元素下移
void AdjustDown(int r[],int i,int n)
{
int child;
int temp;
for (temp = r[i]; 2 * i + 1 < n; i = child)
{
child = 2 * i + 1;
if (child !=n - 1 && r[child + 1] > r[child])
++child;
if (temp < r[child])
r[i] = r[child];
else
break;
}
r[i] = temp;
}
//创建大顶堆
void BuildMaxHeap(int r[], int n)
{
int i;
for (i = n / 2; i >= 0; i--)
AdjustDown(r, i, n);
}
//交换
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//堆排序
void heapSort(int r[],int n)
{
int i;
BuildMaxHeap(r, n);
for (i = n - 1; i > 0; i--)
{
swap(&r[0], &r[i]);
AdjustDown(r, 0, i);
}
printf("\n堆排序后序列为:");
for (int j = 0; j < n; j++)
printf("%d ", r[j]);
}
void main()
{
Indata();
SelectSort(R, count);
heapSort(R, count);
system("pause");
}