简单选择排序
1.思想
(1)从待排序序列中,找到关键字最小的元素;
(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。
2.代码
#include<bits/stdc++.h>
using namespace std;
/***简单选择排序**/
void selectSort(int arr[])
{
for (int i = 0; i < 8-1; i++)
{
//每一趟循环比较时,min用于存放较小元素的数组下标
/*
这样当前批次比较完毕最终存放的就是此趟内最小的元素的下标,
避免每次遇到较小元素都要进行交换。
*/
int min = i;
for (int j = i + 1; j < 8; j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
//进行交换,如果min发生变化,则进行交换
if (min != i)
{
swap(arr[min],arr[i]);
}
/*****************输出************************/
cout<<"第"<<i+1<<"次比较: " ;
for(int i=0;i<8;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
/*****************************************/
}
}
int main()
{
int arr[8]={9,0,6,7,1,5,4,8};
selectSort(arr);
}
3.性能
堆排序
1.思想
完全二叉树:
若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。
步骤:
1.)构造堆
2.)交换堆得末尾元素和根结点
3.)删除末尾结点
4.)依次循环
因为根结点是堆中最大或最小的元素(取决于构造的是大顶堆还是小顶堆),所以删除得到的序列必是有序的。
堆排序详解:http://www.cnblogs.com/jingmoxukong/p/4303826.html
2.代码
#include<bits/stdc++.h>
using namespace std;
/***堆排序**/
/********堆筛选调整*******/
void HeapAdjust(int array[], int parent, int length)
{
int temp = array[parent]; //temp保存当前父节点
int child = 2 * parent + 1; //先获得左孩子
while (child < length)
{
//如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
if (child + 1 < length && array[child] < array[child + 1])
{
child++;
}
//如果父结点的值已经大于孩子结点的值,则直接结束
if (temp >= array[child])
break;
//把孩子结点的值赋给父结点
array[parent] = array[child];
//选取孩子结点的左孩子结点,继续向下筛选
parent = child;
child = 2 * child + 1;
}
array[parent] = temp;
}
/***************************************************/
//堆排序主要算法
void heapSort(int list[],int length)
{
//循环建立初始堆
for (int i = length/ 2; i >= 0; i--)
{
HeapAdjust(list, i, length);
}
//进行n-1次循环,完成排序
for (int i = length-1; i > 0; i--)
{
//最后一个元素和第一元素进行交换
int temp = list[i];
list[i] = list[0];
list[0] = temp;
//筛选R[0]结点,得到i-1个结点的堆
HeapAdjust(list, 0, i);
/********每轮后输出*******/
cout<<"第"<<length-i<<"趟: ";
for (int i = 0; i <length; i++)
{
cout<<list[i]<<" ";
}
cout<<endl;
}
}
/************************************************/
int main()
{
int array[]={1,3,4,5,2,6,9,7,8,0};
int n=sizeof(array)/sizeof(int);
heapSort(array,n);
//通过根堆建立完毕后:9 8 6 7 2 1 4 3 5 0
}
3.性能