• 常用的排序


    不知不觉都过了一年了,只能感叹时光易逝啊。

    10号要去软件园那边应聘实习生,所以今天晚上抽点时间复习了一遍常用的排序。

    一. 冒泡

    void MaoPao(int *nums, int length)
    {
    	for (int i = length-2; i > 0; i--)
    	{
    		for (int j = 0; j <= i; j++)
    		{
    			if (nums[j + 1] < nums[j])
    			{
    				swap(&nums[j], &nums[j+1]);
    			}
    		}
    	}
    }
    

      这是最基础也是最容易想到的排序之一。时间(n²),没啥好说的。

    二. 选择

    void XuanZhe(int *nums, int length)
    {
    	int minIndex = 0;
    	bool changed = false;
    	for (int i = 0; i < length-1; i++)
    	{
    		changed = false;
    		minIndex = i;
    		for (int j = i; j < length; j++)
    		{
    			if (nums[j] < nums[minIndex])
    			{
    				minIndex = j;
    				changed = true;
    			}			
    		}
    		if (changed) 
    		{
    			swap(&nums[i], &nums[minIndex]);
    		}
    	}
    }
    

      在冒泡、选择、插入里,选择排序算不错的了,起码对内存的操作没有其他两个那么频繁。

    三. 插入

    void ChaRu(int *nums, int length)
    {
    	for (int i = 1; i < length; i++) 
    	{
    		for (int j = 0; j < i; j++)
    		{
    			if (nums[i] < nums[j])
    			{
    				int temp = nums[i];
    				for (int k = i; k > j; k--)
    					nums[k] = nums[k - 1];
    				nums[j] = temp;
    			}
    		}
    	}
    }
    

      插入排序的代码让我想起了大一学C语言的灰暗时光。。。

    四. 快排

    void KuaiPai_DieDai(int *nums, int start, int end)
    {
    	if (start >= end)
    		return;
    	int high = end;
    	int low = start;
    	while (low < high)
    	{
    		while(nums[high] >= nums[low]&& low < high)
    			high--;
    		if(low < high)
    			swap(&nums[low], &nums[high]);
    		while (nums[low] <= nums[high] && low < high)
    			low++;
    		if (low < high)
    			swap(&nums[low], &nums[high]);
    	}
    	KuaiPai_DieDai(nums, start, low-1);
    	KuaiPai_DieDai(nums, high+1, end);
    }
    

      快排就舒服多了。除了不少的low<high有碍观瞻,不管是复杂度还是代码都算很不错的。

    五.归并

    void GuiBing_DieDai(int *nums, int start, int end, int* temp)
    {
    	if (start >= end)
    		return;
    	int mid = (start + end) / 2;
    	GuiBing_DieDai(nums, start, mid, temp);
    	GuiBing_DieDai(nums, mid + 1, end, temp);
    
    	int first_low = start;
    	int first_high = mid;
    	int second_low = mid+1;
    	int second_high = end;
    	int tempIndex = 0;
    
    	while (first_low <= first_high && second_low <= second_high)
    	{
    		if (nums[first_low] < nums[second_low] )
    		{
    			temp[tempIndex++] = nums[first_low];
    			first_low++;
    		}
    		else
    		{
    			temp[tempIndex++] = nums[second_low];
    			second_low++;
    		}
    	}
    	while (first_low <= first_high)
    	{
    		temp[tempIndex++] = nums[first_low];
    		first_low++;
    	}
    	while (second_low <= second_high)
    	{
    		temp[tempIndex++] = nums[second_low];
    		second_low++;
    	}
    	for (int i = 0; i < tempIndex; i++)
    	{
    		nums[start + i] = temp[i];
    	}
    }
    

      归并看起来就不那么舒服了,特别是空间上,除了递归的开销还要加个n。不过好在它是稳定的。

    六.堆排序

    void HeapAdjust(int *nums, int i, int length)
    {
    	int max = i;
    	int lchild = i * 2 + 1;
    	int rchild = i * 2 + 2;
    	if (lchild < length && nums[lchild] > nums[max])
    	{
    		max = lchild;
    	}
    	if (rchild < length && nums[rchild] > nums[max])
    	{
    		max = rchild;
    	}
    	if (max != i)
    	{
    		int temp;
    		temp = nums[i];
    		nums[i] = nums[max];
    		nums[max] = temp;
    		HeapAdjust(nums, max, length);
    	}
    }
    void Dui(int *nums, int length)
    {
    	for (int i = length / 2 - 1; i >= 0; i--)
    	{
    		HeapAdjust(nums, i, length);
    	}
    	for (int i = length - 1; i >= 0; i--)
    	{
    		swap(&nums[i], &nums[0]);
    		HeapAdjust(nums, 0, i);
    	}
    }
    

      第一个for循环构建大顶堆,第二个for循环开始排序。

    找实习好难啊。。。

  • 相关阅读:
    禁止button响应回车(.net页面)
    windows server 2022避坑指南
    windows中powershell无法使用ng命令
    使用IKVM实现C#调用jar包
    CENTOS7破解ROOT密码
    【原创】LINQ to SQL学习笔记(一)——Where
    【原创】LINQ to SQL学习笔记(四)——Join(1)
    【原创】LINQ to SQL学习笔记(三)——聚集函数(一)
    【原创】LINQ to SQL学习笔记(二)——Select
    cookie 的使用和一些注意事项
  • 原文地址:https://www.cnblogs.com/charsoul/p/10828949.html
Copyright © 2020-2023  润新知