简单排序包括简单选择排序、直接插入排序和冒泡排序。时间负责度均为O(n2).

1、 简单选择排序(Selection sort)——不稳定

基本思想:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

 

Template<class T>
void SelectSort(T A[], int n)
{
int min,temp;
for(int i=0;i<n-1;i++)
min=I;
for(int j=i+1;j<n;j++)
{if(A[j]<A[min]) min=j;}
If(min!=i)
{
temp=A[i];
A[i]=A[min];
A[min]=temp;
}
}

2、 直接插入排序(Insert sort)——稳定

基本思想:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

void Insertsort2(int a[], int n)  
{  
    int i, j;  
    for (i = 1; i < n; i++)  
        if (a[i] < a[i - 1])  
        {  
            int temp = a[i];  
            for (j = i - 1; j >= 0 && a[j] > temp; j--)  
                a[j + 1] = a[j];  
            a[j + 1] = temp;  
        }  
} 

这里进行了一下改写,将搜索和数据后移这二个步骤合并。即每次a[i]先和前面一个数据a[i-1]比较,如果a[i] > a[i-1]说明a[0…i]也是有序的,无须调整。否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]<a[i]时停止并将temp放到a[j + 1]处。

这样更便于理解,也更高效。

2、 冒泡排序(Insert sort)——稳定

基本思想:它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!

void BubbleSort1(int a[], int n)  
{  
       int i, j;  
       for (i = n-1; i >0; i--)  
              for (j = 0; j <  i; j++)  
                     if (a[j] > a[j+1])  
                            Swap(a[j], a[j+1]);  
} 

改进的冒泡排序可以用flag标记是否产生了交换
void bubbleSort2(int* a, int n)
 {
     int i,j,tmp;
     int flag;                 // 标记
 
     for (i=n-1; i>0; i--)
     {
         flag = 0;            // 初始化标记为0
 
         // 将a[0...i]中最大的数据放在末尾
         for (j=0; j<i; j++)
         {
             if (a[j] > a[j+1])
             {
                 // 交换a[j]和a[j+1]
                 tmp = a[j];
                 a[j] = a[j+1];
                 a[j+1] = tmp;
 
                 flag = 1;    // 若发生交换,则设标记为1
             }
         }
 
         if (flag==0)
             break;            // 若没发生交换,则说明数列已有序。
     }
 }