当前位置: 首页 > news >正文

wordpress修改引用地址扬州seo推广

wordpress修改引用地址,扬州seo推广,男人最爱上的做网站,网站开发的高级阶段包括文章目录 1.排序概念2.10种排序比较3.排序算法3.1直接插入排序(元素越有序,越高效)3.2希尔排序序( 缩小增量排序 )3.3直接选择排序3.5堆排序3.6冒泡排序3.8快速排序 递归实现(无序使用最好)3.8.1挖坑法 (建…

文章目录

    • 1.排序概念
    • 2.10种排序比较
    • 3.排序算法
    • 3.1直接插入排序(元素越有序,越高效)
    • 3.2希尔排序序( 缩小增量排序 )
    • 3.3直接选择排序
    • 3.5堆排序
    • 3.6冒泡排序
    • 3.8快速排序 递归实现(无序使用最好)
      • 3.8.1挖坑法 (建议用这个 找基准)
      • 3.8.2Hoare法
      • 3.8.3三数取中法 优化排序算法
    • 3.9 快速排序 非递归实现
    • 4.0归并排序
    • 4.1计数排序
    • 4.2基数排序
    • 4.3桶排序

1.排序概念

排序:就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

稳定性:假设一组序列中,有两个相同的元素,在排序之后,两个相同元素的前后顺序颠倒了,说明这个排序算法是不稳定的,反之。

在这里插入图片描述

2.10种排序比较

在这里插入图片描述
在这里插入图片描述

3.排序算法

3.1直接插入排序(元素越有序,越高效)

思路:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到
一个新的有序序列 。

在这里插入图片描述

 /** 时间复杂度:最坏:o(N^2)*            最好:O(N)   数据都有序,j不会往前走,直接break*               当数据趋于有序的时候,排序速度非常快*               一般场景就是数据基本有序,建议使用直接插入排序* 空间复杂度:O(1)* 稳定性:稳定*    如果一个排序是稳定的,那么就可以实现为不稳定的,*     但是如果一个排序本身就是不稳定的,那么不能变成稳定的** */
 //插入排序public static void insertSort(int[] array) {for (int i = 1; i < array.length; i++) {int temp = array[i];int j = i - 1;for (; j >= 0; j--) {if (array[j] > temp) {array[j + 1] = array[j];} else {break;}}array[j + 1] = temp;}}

3.2希尔排序序( 缩小增量排序 )

基本思想:希尔排序是选的一个增量值分组,然后对每组使用直接插入排序算法排序,随着增量值减小,每组包含的值也越来越多,当增量值减为1时,整个序列在一组内排序

在这里插入图片描述

上代码:

 //希尔排序   每组进行插入排序/*时间复杂度:O(N^1.3) - O(N ^ 1.5)*空间复杂度:o(1)* 稳定性:不稳定的排序**/public static void shellSort(int[] array) {int gap = array.length;while (gap > 1) {gap /= 2;shell(array, gap);}}//插入排序 ------->gappublic static void shell(int[] array, int gap) {for (int i = gap; i < array.length; i++) {int temp = array[i];int j = i - gap;for (; j >= 0; j -= gap) {if (array[j] > temp) {array[j + gap] = array[j];} else {break;}}array[j + gap] = temp;}}

3.3直接选择排序

基本思想:在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
在这里插入图片描述

(1)第一种

/*选择排序*时间复杂度:O(N^2)* 空间复杂度:o(1)* 稳定性:不稳定** */public static void selectSort(int[] arrays) {for (int i = 0; i < arrays.length; i++) {int minIndex = i;for (int j = i + 1; j < arrays.length; j++) {if (arrays[j] < arrays[minIndex]) {minIndex = j;}}swap(arrays, i, minIndex);}}private static void swap(int[] array, int i, int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}

(2)前面是用了一个minIndex去找最小值然后交换,最后排序

那么如果用两个一个minIndex去找最小值,一个maxIndex去找最大值,然后用left指向前,right指向后,比如说是升序那就minIndex和left交换,maxIndex和right交换,这样效率应该是比第一种方法要快

在这里插入图片描述

3.5堆排序

基本思想:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

在这里插入图片描述

/*堆排序*时间复杂度:O(Nlogn)* 空间复杂度:O(1)* 稳定性:不稳定* */public static void heapSort(int[] array) {createBigHeap(array);int end = array.length - 1;while (end > 0) {swap(array, 0, end);shiftDown(array, 0, end);end--;}}private static void createBigHeap(int[] array) {for (int parent = (array.length - 1 - 1) / 2; parent >= 0; parent--) {shiftDown(array, parent, array.length);}}private static void shiftDown(int[] array, int parent, int len) {int child = parent * 2 + 1;//至少有左孩子while (child < len) {if (child + 1 < len && array[child] < array[child + 1]) {//有右孩子,且右孩子最大child++;}if (array[child] > array[parent]) {swap(array, child, parent);parent = child;child = 2 * parent + 1;} else {//child比parent小,不需要调整break;}}}

3.6冒泡排序

基本思想:冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复的进行上面的步骤,直到没有再需要交换的
在这里插入图片描述

 /** 冒泡排序* 时间复杂度:不考虑优化 O(N^2),优化后,o(N)*空间复杂度o(1)* 稳定性:稳定* */public static void bubbleSort(int[] array) {for (int i = 0; i < array.length; i++) {//考虑优化如果某一轮中没有发生交换,则证明已经有序,不必进行后面轮数boolean flg = false;for (int j = 0; j < array.length - 1 - i; j++) {if (array[j] > array[j + 1]) {swap(array, j, j + 1);flg = true;}}if (flg == false) {return;}}}private static void swap(int[] array, int i, int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}

3.8快速排序 递归实现(无序使用最好)

基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,
左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,
然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
在写递归的过程中可联想 二叉树的前序遍历 找基准值 进行区间划分

 //快速排序/** 时间复杂度:N*logN*            最好情况:N*logN*            最坏情况:N^2   有序   倒序   (只有左树或者只有右树)* 空间复杂度:*            最好情况:logN*            最坏情况:N* 稳定性:不稳定** *///1.递归实现快速排序public static void quickSort(int[] array) {quick(array, 0, array.length - 1);}private static void quick(int[] array, int start, int end) {//递归结束条件//为什么取大于号  :1,2,3,4   越界if (start >= end) {return;}//基准int pivot = partition(array, start, end);//划分quick(array, start, pivot - 1);quick(array, pivot + 1, end);}//插入排序public static void insertSort2(int[] array, int start, int end) {for (int i = start + 1; i <= end; i++) {int temp = array[i];int j = i - 1;for (; j >= 0; j--) {if (array[j] > temp) {array[j + 1] = array[j];} else {break;}}array[j + 1] = temp;}}

3.8.1挖坑法 (建议用这个 找基准)

必须先走右边,再走左边,这样就不会出现将大的放在前面的情况
在这里插入图片描述

//基准  挖坑法private static int partition(int[] array, int left, int right) {int tmp = array[left];while (left < right) {//left<right   不然会越界//“ = ”必须取,不然会发生死循环:6  23 1  3 6while (left < right && array[right] >= tmp) {right--;}array[left] = array[right];while (left < right && array[left] <= tmp) {left++;}array[right] = array[left];}array[left] = tmp;return left;}

3.8.2Hoare法

在这里插入图片描述

//Hoare法private static int partition2(int[] array, int left, int right) {int tmp = array[left];int i = left;while (left < right) {//为什么要先从右边走,因为左边先停下来就会比tmp大,与i位置交换就会把比tmp大的换到前面while (left < right && array[right] >= tmp) {right--;}while (left < right && array[left] <= tmp) {left++;}swap(array, left, right);}swap(array, left, i);return left;}

3.8.3三数取中法 优化排序算法

在这里插入图片描述

在这里插入图片描述

 //1.递归实现快速排序public static void quickSort(int[] array) {quick(array, 0, array.length - 1);}private static void quick(int[] array, int start, int end) {//递归结束条件//为什么取大于号  :1,2,3,4   越界if (start >= end) {return;}//优化2:解决减少递归的次数if (end - start + 1 <= 14) {//假设有十万条数据,还剩十几条,那么数据基本有序,用插入排序更高效insertSort2(array, start, end);return;}// 三数取中法优化1:不用每一次都用start,而是从start ,mid  ,end中取一个中间数来作为基准然后将它与start位置的数交换位置即可,// 后续不用改变int i = minThree(array, start, end);swap(array, i, start);//基准int pivot = partition2(array, start, end);//划分quick(array, start, pivot - 1);quick(array, pivot + 1, end);}//三数取中法private static int minThree(int[] array, int start, int end) {int mid = (start + end) / 2;if (start < end) {if (mid < start) {return start;} else if (mid > end) {return end;} else {return mid;}} else {if (mid < end) {return end;} else if (mid > start) {return start;} else {return mid;}}}

3.9 快速排序 非递归实现

第一个分析:
在这里插入图片描述
第二个分析:
在这里插入图片描述
上代码:

//2.非递归实现快速排序/** 时间复杂度:O(Nlog n)* 空间复杂度:O(log n)* 稳定性:不稳定* */public static void quickSort2(int[] array) {Deque<Integer> stack = new LinkedList<>();int left = 0;int right = array.length - 1;int pivot = partition(array, left, right);//保证左边与右边都大于两个元素,才可以排序,只有一个元素就不用排序了if (pivot > left + 1) {stack.push(left);stack.push(pivot - 1);}if (pivot < right - 1) {stack.push(pivot + 1);stack.push(right);}while (!stack.isEmpty()) {right = stack.pop();left = stack.pop();pivot = partition(array, left, right);//保证左边与右边都大于两个元素,才可以排序,只有一个元素就不用排序了if (pivot > left + 1) {stack.push(left);stack.push(pivot - 1);}if (pivot < right - 1) {stack.push(pivot + 1);stack.push(right);}}}

4.0归并排序

基本思想:归并排序是建立在归并操作上的一种有效的排序算法,将已有序的子序列合并,得到完全有序的序列;也就是先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

递归实现:
在这里插入图片描述

//归并排序public static void mergeSort(int[] array) {mergeSortFunc(array, 0, array.length - 1);}private static void mergeSortFunc(int[] array, int start, int end) {//和快速排序原因一样if (start >= end) {return;}int mid = (end + start) / 2;//分mergeSortFunc(array, start, mid);mergeSortFunc(array, mid + 1, end);//并merge(array, start, end, mid);}private static void merge(int[] array, int start, int end, int mid) {int s1 = start;int s2 = mid + 1;//tmp数组下标int k = 0;//合并成一个临时数组int[] tmp = new int[end - start + 1];while (s1 <= mid && s2 <= end) {if (array[s1] <= array[s2]) {tmp[k++] = array[s1++];} else {tmp[k++] = array[s2++];}}//s2数组为空时,s1还有数据while (s1 <= mid) {tmp[k++] = array[s1++];}//同样的while (s2 <= end) {tmp[k++] = array[s2++];}//将tmp临时数组数据给原数组for (int i = 0; i < tmp.length; i++) {//这里start+i意思是,不一定start都是0下标开始的array[i + start] = tmp[i];}}

非递归实现归并排序:

  //非递归实现归并排序public static void mergeSort2(int[] array) {int gap = 1;while (gap < array.length) {//i += gap * 2,当前组拍序好后,i往后移动,排序下一组for (int i = 0; i < array.length; i += gap * 2) {int left = i;int mid = i + gap - 1;if (mid >= array.length) {避免越界异常mid = array.length - 1;}int right = mid + gap;//if (right >= array.length) {//避免越界异常right = array.length - 1;}merge(array, left, right, mid);}//间隙为1的每组排序好后,改为间隙为2的每组,重复上述步骤,接着排序下一组,直到gap//超过array.lengh,就排序好了gap *= 2;}}

4.1计数排序

在这里插入图片描述

 //计数排序/** 时间复杂度:O(N+范围)* 空间复杂度:** */public static void countSort(int[] array) {//1遍历数组,找到数组最大值和最小值int min = array[0];int max = array[0];for (int i = 1; i < array.length; i++) {if (array[i] < min) {min = array[i];}if (array[i] > max) {max = array[i];}}//2确定计数数组的长度int len = max - min + 1;int[] count = new int[len];//3遍历array数组,在计数数组中记录数字出现的个数for (int i = 0; i < array.length; i++) {count[array[i] - min]++;}//根据计数数组,将数字按照数组顺序重新返回array数组int index = 0;for (int i = 0; i < count.length; i++) {while (count[i] > 0) {//这里i+min:在array中加上min,反映真实数据array[index] = i + min;index++;count[i]--;}}}

4.2基数排序

基本思想:基数排序是利用分配和收集两种基本操作。
基数排序是一种按记录关键字的各位值逐步进行排序的方法。
此种排序一般适用于记录的关键字为整数类型的情况。所有对于字符串和文字排序不适合。

在这里插入图片描述

  private static void radixSort(int[] arr) {//待排序列最大值int max = arr[0];int exp;//指数//计算最大值for (int anArr : arr) {if (anArr > max) {max = anArr;}}//从个位开始,对数组进行排序for (exp = 1; max / exp > 0; exp *= 10) {//存储待排元素的临时数组int[] temp = new int[arr.length];//分桶个数int[] buckets = new int[10];//将数据出现的次数存储在buckets中for (int value : arr) {//(value / exp) % 10 :value的最底位(个位)buckets[(value / exp) % 10]++;}//更改buckets[i],for (int i = 1; i < 10; i++) {buckets[i] += buckets[i - 1];}//将数据存储到临时数组temp中for (int i = arr.length - 1; i >= 0; i--) {temp[buckets[(arr[i] / exp) % 10] - 1] = arr[i];buckets[(arr[i] / exp) % 10]--;}//将有序元素temp赋给arrSystem.arraycopy(temp, 0, arr, 0, arr.length);}}

4.3桶排序

基本思想:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了

在这里插入图片描述

public static void bucketSort(int[] arr){// 计算最大值与最小值int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;for(int i = 0; i < arr.length; i++){max = Math.max(max, arr[i]);min = Math.min(min, arr[i]);}// 计算桶的数量int bucketNum = (max - min) / arr.length + 1;ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);for(int i = 0; i < bucketNum; i++){bucketArr.add(new ArrayList<Integer>());}// 将每个元素放入桶for(int i = 0; i < arr.length; i++){int num = (arr[i] - min) / (arr.length);bucketArr.get(num).add(arr[i]);}// 对每个桶进行排序for(int i = 0; i < bucketArr.size(); i++){Collections.sort(bucketArr.get(i));}// 将桶中的元素赋值到原序列int index = 0;for(int i = 0; i < bucketArr.size(); i++){for(int j = 0; j < bucketArr.get(i).size(); j++){arr[index++] = bucketArr.get(i).get(j);}}  
}
http://www.dinnco.com/news/26002.html

相关文章:

  • 品牌网站建设小i蝌蚪品牌营销策划怎么写
  • 做一个自己的免费网站吗百度引流平台
  • 响应式外贸建站百度助手
  • 专业网站建设找哪家好百度引擎入口
  • 网站分析与优化的文章怎么做网站推广
  • wordpress页面相册seo教程搜索引擎优化入门与进阶
  • 尚未设置自定义缩略图wordpressseo关键词优化是什么意思
  • 太原网站优化教程百度网络营销中心客服电话
  • 小公司网站如何做网络营销有哪几种方式
  • 公司建设网站需要什么条件中国北京出啥大事了
  • 百度首页网站推广多少钱一年网络营销运营策划
  • 网站源码风险html友情链接代码
  • 肃州区建设局网站bt兔子磁力搜索
  • h5页面制作代码网络营销郑州优化推广公司
  • 美国生物等效性如果做的网站厦门谷歌推广
  • 做属于自己公司的网站移动慧生活app下载
  • php婚庆网站源码上海seo培训
  • 个人做理财网站廊坊seo优化排名
  • 哪里有免费的ppt模板下载网站长沙专业网站制作
  • 上海做网站比较好的公司有哪些百度搜索排名优化哪家好
  • 怀化灵知网站建设班级优化大师app下载
  • 网页游戏排行榜前十知乎天津的网络优化公司排名
  • 济南传承网站建设公司seo标签怎么优化
  • 如何做亚马逊备案的网站手机app推广平台
  • 网站定制开发费用多少网站关键词优化推广哪家好
  • 荥阳做网站推广广州seo网站排名
  • 成都网站登记备案查询优质网站
  • 网站运营与管理的心得体会教你如何快速建站
  • 洛阳青峰网络让人去培训宁波seo网络推广咨询热线
  • 合肥 网站建设网站优化什么意思