排序

排序

稳定排序:相等的数字位置不变

非稳定排序:相等的数位置变换

内排序:一次性装进内存

外排序:先装到外存,再分步装到内存

插入排序

void insertSort(int *arr, int len) 
{
	int i, j, tmp;   
	if(len == 1)    
    	return;   
    for(i=1; i<len; i++) //从arr[1] 到arr[len - 1]   
    {
        tmp = arr[i];     //从arr[i-1](arr[j])向前面查找插入位置     
        	for(j = i-1;  j >=0; j--)     
        	{       
        		if(arr[j] < tmp)          
        		break;       
        		else       
        		{         
        			arr[j+1]=arr[j];       
        		} 
              }    
              arr[j+1] = tmp; 
     }      
}

希尔排序

相隔一定间隔局部有序,再整体排序

1.分组
2.插入排序
3.逐步减少增量

image-20240715154838124

void shellSort(int arr[], int n) 
{
    //缩小增量,以长度8为例,增量变化:4  2  1
    for (int gap = n / 2; gap > 0; gap /= 2) 
    {
        //组内排序 元素arr[gap]到arr[n-1]
        for (int i = gap; i < n; i++)//
        {
                int temp = arr[i];
                int j;                 //arr[0]>arr[4]
                for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
                {
                        arr[j] = arr[j - gap];
                }
                arr[j] = temp;
        }
    }
}

冒泡排序

void maopaoSort(int arr[], int n) 
{
    int i, j;
    //需要排序的数组次数
    for(i=0; i< (n-1); i++)
    {
        //数组内排序 5-1 = 4
        for(j=0; j < (n-i-1) ; j++)
        {
            if(arr[j] > arr[j+1])
            {
                //数据交换
                int tmp  = arr[j+1];
                arr[j+1] = arr[j];
                arr[j]   = tmp;
            }
        }
    }
}

选择排序

​ 选择排序就是依次从头到尾挑选合适的元素放到前面。如果总共有n个节点,那么选择一个合适的节点需要比较n次,而总共要选择n次,因此总的时间复杂度是O(n2)

void swap(int *a, int *b)
{

    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
void select(int *p,int len)
{
    int i, j, min;

    for(i=0; i<len; i++)
    {
        min = i;  //最小值下标
        for(j = i+1; j<len; j++)
        {
            if(p[j] < p[min]) //如果最p[j] 小于 p[min],要更换最小下标
            {
                min = j;
            }

        }
       swap(&p[i], &p[min]); 
    }
    return;
} 

快速排序

快排是一种递归思想的排序算法,先比较其他的排序算法,它需要更多内存空间,但快排的语句频度是最低的,理论上时间效率是最高的。

快速排序的基本思路是:在待排序序列中随便选取一个数据,作为所谓“支点”,然后所有其他的数据与之比较,以从小到大排序为例,那么比支点小的统统放在其左边,比支点大的统统放在其右边,全部比完之后,支点将位与两个序列的中间,这叫做一次划分(partition)。

一次划分之后,序列内部也许是无序的,但是序列与支点三者之间,形成了一种基本的有序状态,接下去使用相同的思路,递归地对左右两边的子序列进行排序,直到子序列的长度小于等于1为止。

void display(int *arr, int len)
{
    int i;
    for(i=0; i<len; i++)
    {
        printf("%d\t", arr[i]);
    }
    printf("\n");
}
void swap(int *a, int *b)
{
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}
//找支点
int partion(int *arr, int len)
{
    int i, j;
    if(len <= 1)
        return 0;
    i = 0; 
    j = len-1;
    while(i < j)
    {
        while(arr[i] < arr[j] && i<j)
        {
            j--;
        }
        swap(&arr[i], &arr[j]);
        while(arr[i] <= arr[j] && i<j)
        {
            i++;
        }
        swap(&arr[i], &arr[j]);
    }
  
    //返回支点
    return i;
}
//快速排序
void quickSort(int arr[],int len)
{
    if(len <= 1)
        return;
    
    //找支点
    int pivort=partion(arr, len);
    //左边
    quickSort(arr, pivort); 
    //右边
    quickSort(arr+pivort+1, len-pivort-1); 
} 
posted @ 2024-07-15 19:14  do泽  阅读(1)  评论(0编辑  收藏  举报