本节对一些简单的排序算法做了一个学习,对于个人认为比较难的对排序和基数排序,作者尚未学习完成,因此需要进一步学习的人可以参考:http://blog.youkuaiyun.com/talking12391239/article/details/9079961和http://blog.youkuaiyun.com/yangzl2008/article/details/10344065,http://hxraid.iteye.com/blog/646760
#include<iostream>
using namespace std;
//1.插入排序
void insertSort(int num[],int len);
//2.希尔排序或者自动增量排序
void shellSort(int* num,int len);
//3.冒泡排序
void bubbleSort(int* num,int len);
//4.快速排序
int oneQuikSort(int* num,int low ,int high);
void quikSort(int* num, int low,int high);
//5.选择排序
void selectSort(int* num, int len);
int main()
{
int num[] = {6,2,1,9,7,4};
//shellSort(num,6);
//bubbleSort(num,6);
//quikSort(num,0,5);
selectSort(num,6);
for(int i=0; i<6;i++)
cout<<num[i]<<" ";
return 1;
}
/************************************************************************/
/*直接插入排序
将整个数组分为已经排好序的部分,和未排好序的部分,未排好序的部分想已经排好序的部分插入数据
整个算法的精妙之处在于,哨兵的设置。
1、将要插入的值拿出来,当成哨兵。因为设置了哨兵,因此向后移动过程中,不用担心数值覆盖。
2、向排好序的部分插入时,比较过程和移动过程一起进行(这是数组的特点)。与哨兵进行比较。
3、在得到目的地址之后,直接插入即可。
*/
/************************************************************************/
void insertSort(int num[],int len)
{
int temp;//哨兵
int j;
for(int i=0; i<len; i++)
{
temp = num[i];
for( j=i; j>=1; j--)
{
if(num[j-1] > temp)
{
num[j] = num[j-1];
}
}
num[j] = temp;
}
}
/************************************************************************/
/* 希尔排序,缩小增量排序。
其是在直接插入排序基础之上,利用
1、在排序记录基本为正序时期复杂度降为O(n)的情况。
2、直接插入排序简单,在n值很小时效率也很高。
希尔排序的时间复杂度不好估量,gap的选取也没有定论,gap=[gap/2]的程序较好写。
*/
/************************************************************************/
void shellSort(int* num,int len)
{
int step = len/2;
int i,j,temp;
while(step >= 1)
{
for(i = step; i< len; i++)
{
temp = num[i];
for(j=i; j-step>=0; j-=step)
{
if(temp < num[j-step])
{
num[j] = num[j-step];
}
else
break;
}
num[j] = temp;
}
step/=2;
}
}
void bubbleSort(int* a,int n)
{
int i,j;
int temp;
for(i = n; i>1;i--)
{
for(j =1; j< i; j++) //内层循环的意思是,对没个元素都要与其他未排的元素进行比较
//内存排序可以理解为找最大的元素出来。但是找的过程中,
//因为len-i这些元素已经排序过了,因此,没有必要再次比较。
//而len-i-1的原因是,需要进行a[j+1]的比较。
{
if(a[j-1] > a[j])
{
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
}
//快速排序
/************************************************************************/
/* 是对冒泡排序的一种改进,通过一趟排序将待排序的记录分成独立的两部分,
其中一部分比另一部分记录的关键字小。然后对这两部分分记录进行快速排序。 递归的栈空间为O(logn)
*/
/************************************************************************/
int oneQuikSort(int* num,int low,int high)//一趟快速排序
{
int key = num[low];
int temp;
while(low < high)
{
while(num[high] > key) high--;
temp = num[high];
num[high] = num[low];
num[low] = temp;
while(num[low] < key) low++;
temp = num[low];
num[low] = num[high];
num[high] = temp;
}
return low;
}
void quikSort(int* num,int low,int high)
{
if(low < high)
{
int mid = oneQuikSort(num,low,high);
quikSort(num,low,mid-1);
quikSort(num,mid+1,high);
}
}
//在每趟比较重选择最小的输放在相应的位置
void selectSort(int* num, int len)
{
for(int i=0; i<len; i++)
{
for(int j=i+1; j<len; j++)
{
if(num[j] < num[i])
{
int temp = num[j];
num[j] = num[i];
num[i] = temp;
}
}
}
}