【数据结构学习笔记】——排序

冒泡排序

思想

一列数据,从第一个开始检查,检查与下一个元素的大小,如果前者大于后者,则交换位置。一次排序可以使最大的元素位于最后的位置。

代码

    void bubble(int a[],int n){  //一次冒泡 
    for(int i=0;i<n-1;i++)
    if(a[i]>a[i+1])
    swap(a[i],a[i+1]);//交换位置函数
    }

上面代码无论原序列是否排序,都需要检查。时间复杂度总是 O(n^2)

void bubblesort (int a[],int n){
    for(bool sorted=false;sorted=!sorted;n--)
        for(int i=0;i<n;i++){
            if(a[i]>a[i+1]){
                swap(a[i],a[i+1]);
                sorted=false;
            }
        }

}

解释:sorted=!sorted 是将sorted值反转。=是赋值,是非。在c++中!=是不等于判断符号。
所以,如果进行了交换,那么就将sorted置于否,说明排序没有完成。如果已经有序,sorted则变为真,在反转之后变为假,循环结束。排序完成。

直接插入排序

思想

一列序列,若只有一个元素,则肯定是有序的。我们从第二个开始看起,与前面的元素进行比较,放入它应该存在的位置,直到最后一个元素放入,排序完成。

代码

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

解释:将每一个准备新插入进来的元素赋给temp,与它前面元素开始比较,选择插入位置。

选择排序

思想

遍历所有元素,选出最大的放在最后的位置,则一次过后将元素个数缩小为n-1个。

代码

void selectionsort(int a[],int n){
    bool sorted=false;
    for(int size=n;!sorted&&(size>1);size--){
        int pos=0;
        sorted=true;
        for(int i=1;i<size;i++)
        if(a[pos]<=a[i]) pos=i;  //选出最大的 
        else sorted=false;
        swap(a[pos],a[size-1]);  //将最大的放在数组最后一个  
    }
}

快速排序

思想

在一列数组中,选取一个key值(本代码取第一个),经过一次排序之后将序列分为两部分,左侧部分都比key值小,右侧部分都比key值大(但各个部分中是无序的)。再进行0~key,key+1~n的排序。直到只剩下一个元素。

代码

void quicksort(int a[],int low,int high){

     if(low >= high)   return;  //判断排序已经结束  

    int key=a[low];
    int i=low,j=high;

    while(i<j){
     while(i<j&&a[j]>=key) --j;
     swap(a[i],a[j]);        //a[i]=a[j] 
     while(i<j&&a[i]<=key) ++i;
     swap(a[i],a[j]);        //a[j]=a[i] //也可行  

    }

    quicksort(a,low,i-1);
    quicksort(a,i+1,high);

}

生成随机数进行排序

int main()
{
    srand ( time (NULL) );
    int n;
    cout<<"请输入你想要的数组大小 " ;
    cin>>n;         
    int a[n];                //输入你想要的数组大小 
    for ( int i = 0 ; i < n; i ++ )
     a[i]=rand() %10000;    //生成随机数组 

     cout<<"排序之前数组:"; 
    for(int i=0;i<n;i++)
    cout<<a[i]<<"\t";
    cout<<endl; 

    quicksort(a, 0, sizeof(a) / sizeof(a[0]) - 1);

   cout<<"排序之后数组:"; 
    for(int i=0;i<n;i++)
    cout<<a[i]<<"\t";

    cout<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值