常见排序

xiaoxiao2021-02-28  38

插入排序:

将一组数据分成两组,将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。

为了排序方便,我们一般将数据第一个元素视为有序组,其他均为待插入组。

升序图解:

void InsertionSort(int *num,int n)     {      int i = 0;      int j = 0;      int tmp = 0;      for(i = 1;i<n;i++)      {        tmp = num[i];//从待插入组取出第一个元素。         j = i-1; //i-1即为有序组最后一个元素(与待插入元素相邻)的下标         while(j>=0&&tmp<num[j])  //注意判断条件为两个,j>=0对其进行边界限制。第二个为插入判断条件         {          num[j+1] = num[j];//若不是合适位置,有序组元素向后移动           j--;         }        num[j+1] = tmp;//找到合适位置,将元素插入。       }    }

*******************************************************************************************************

快速排序:

6 1 2 7 9 3 4 5 10 8

以6为基准数

首先设置两个哨兵i 和 j

i指向第一个元素 ,j指向最后一个元素

每次走的时候j先走

j向左移动寻找比基准数小的数字,找到了停下来

i向右移动寻杂比基准数大的数字,找到了停下来

他们互相进行交换

然后j继续向左移动,直到找到比基准数小的数

i同样也是向右移动,知道找到比基准数大的数

如果他们碰面的话,就将他们碰面时指向的数字和基准数进行交换,此时就完成了第一次的基准数归位。

继续以第一个元素为基准数,继续进行以上的操作,知道所有的基准数归位。

//快速排序void quicksort(int a[],int left,int right){    //left 代表是整个数组的第一个以他为基数    //right 代表是数组的最后一个    int i,j,t,temp;    if(left > right)        return ;    temp = a[left];//基准数    i = left;    j = right;    while(i != j)    {        //先从右边开始找        while(a[j] >= temp && i < j)            j--;        //从右边开始找        while(a[i] <= temp && i < j)            i++;        //交换两个数在数组中的位置        if(i < j)        {            t = a[i];            a[i] = a[j];            a[j] = t;        }    }    //基准数归位    a[left] = a[i];    a[i] = temp;    quicksort(a,left,i-1);//继续处理左边的-----递归    quicksort(a,i+1,right);//继续处理右边的----递归}

转载请注明原文地址: https://www.6miu.com/read-2628070.html

最新回复(0)