赞
踩
- //插入排序 核心思想:end + 1;去0 end 之前去找,如果tmp小于end位置,就往end位置往后挪
- void InsertSort(int* arr, int n)
- {
- //n的位置不可访问,所以要 < n; < n - 1为什么? 因为是拿end + 1的位置和前面的比较
- for (int i = 0; i < n - 1; i++)
- {
- int end = i;
- int tmp = arr[end + 1];
- while (end >= 0)//去查找出0 end范围的值
- {
- if (tmp < arr[end])
- {
- arr[end + 1] = arr[end];//如果tmp小于end位置的值,就向后挪,知道大于end位置的值就可以停下插入
- end--;
- }
- else
- {
- break;//此时说明tmp大于end位置,在end+1位置插入
- }
- }
- arr[end + 1] = tmp;//防止都比0 end之间要小,小于0跳出循环,-1 + 1;刚好是第一个位置
- }
- }
- void InsertSort(int* arr, int n)
- {
- //n的位置不可访问,所以要 < n; < n - 1为什么? 因为是拿end + 1的位置和前面的比较
- for (int i = 0; i < n - 1; i++)
- {
- int end = i;
- int tmp = arr[end + 1];
- while (end >= 0)//去查找出0 end范围的值
- {
- if (tmp < arr[end])
- {
- arr[end + 1] = arr[end];//如果tmp小于end位置的值,就向后挪,知道大于end位置的值就可以停下插入
- end--;
- }
- else
- {
- arr[end + 1] = tmp;
- break;//此时说明tmp大于end位置,在end+1位置插入
- }
- }
- if(end == -1)
- {
- arr[end + 1] = tmp;
- }
- //冒泡排序
- void BubblSort(int* arr, int sz)
- {
- for (int i = 0; i < sz - 1; i++)
- {
- int flag = 0;//假设这一趟没有交换已经有序
- for (int j = 0; j < sz - i - 1; j++)
- {
- if (arr[j] > arr[j + 1])
- {
- int tmp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = tmp;
- flag = 1;//发生交换,无序
- }
- }
- if(flag == 0)//经过一趟发现有序,没有交换
- break;
- }
- }
讲完单趟排序,再来说说应该注意的点:
- 使用for来完成一趟排序的结束条件
- 红色这组举例:因为你每次跳gap步,如果 i 循环到了 数字为4的位置,此时进入循环,int tmp = arr[end + gap];这里面的 + gap会越界
最后是for循环是单趟的代码
- for (int i = j; i < n - gap; i += gap)
- {
- int end = i;//对应一趟排序的第几次
- int tmp = arr[end + gap];
- while (end >= 0)//比较交换
- {
- //如果小于arr[end]挪到arr[end + gap]
- if (tmp < arr[end])
- {
- arr[end + gap] = arr[end];
- }
- else
- {
- break;
- }
- }
- arr[end + gap] = tmp;
- }
- //希尔排序的预排序
- void ShellSort(int* arr, int n)
- {
- //假设gap为3
- int gap = 3;
- for (int j = 0; j < gap; j++)
- {
- for (int i = j; i < n - gap; i += gap)
- {
- int end = i;//对应一趟排序的第几次
- int tmp = arr[end + gap];
- while (end >= 0)//比较交换
- {
- //如果小于arr[end]挪到arr[end + gap]
- if (tmp < arr[end])
- {
- arr[end + gap] = arr[end];
- }
- else
- {
- break;
- }
- }
- arr[end + gap] = tmp;
- }
- }
- }
- void ShellSort(int* arr, int n)
- {
- //假设gap为3
- int gap = 3;
- for (int i = 0; i < n - gap; i++)
- {
- int end = i;//对应一趟排序的第几次
- int tmp = arr[end + gap];
- while (end >= 0)//比较交换
- {
- //如果小于arr[end]挪到arr[end + gap]
- if (tmp < arr[end])
- {
- arr[end + gap] = arr[end];
- end -= gap;
- }
- else
- {
- break;
- }
- }
- arr[end + gap] = tmp;
- }
- }
- //希尔排序
- void ShellSort(int* arr, int n)
- {
- int gap = n;
- while (gap > 1)
- {
- //gap > 1 就是预排序
- //gap == 1 就是插入排序
- gap = gap / 3 + 1;
- for (int i = 0; i < n - gap; i++)
- {
- int end = i;//对应一趟排序的第几次
- int tmp = arr[end + gap];
- while (end >= 0)//比较交换
- {
- //如果小于arr[end]挪到arr[end + gap]
- if (tmp < arr[end])
- {
- arr[end + gap] = arr[end];
- end -= gap;
- }
- else
- {
- break;
- }
- }
- arr[end + gap] = tmp;
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。