大家好,欢迎来到IT知识分享网。
最近研究排序序列,稍微总结一下,以后继续补充:
快速排序
排序想思:通过一趟排序将要排序的数据分割成独立的两分部,其中一分部的有所数据都比另外一分部的有所数据都要小,然后再按此法方对这两分部数据别分停止快速排序,全体排序进程可以递归停止,以此到达全体数据成变有序序列。其中,个人认为如何将数据按key排放这一步调最为主要,理解了这里,全体法算该应就明确了。
排序实例:49 38 65 97 76 13 27
key的值,65>49,两者交换,此时:I=2 )
key的值,97>49,两者交换,此时:I=3,J=5 )
key49的数全体在49的前面,有所小于key(49)的数全体在key(49)的面前。
否是定稳:否。
时间复杂度:均平时间复杂度Ο(n log n) ,最坏为O(n^2)。
void swap(int *pLeft,int *pRight) { int temp; temp = *pLeft; *pLeft= *pRight; *pRight = temp; } void my_quick_sort(int a[], int begin, int end) { int compare=a[begin], left =begin,right = end; if(left > right) return; while(left < right) { while ((left < right) && (a[right] >= compare)) right--; swap(&a[left], &a[right]); while ((left < right) && (a[left] <= compare)) left++; swap(&a[left], &a[right]); } my_quick_sort(a, begin, left-1); my_quick_sort(a, left+1, end); }
并归排序
排序想思:并归(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为多少个子序列,每个子序列是有序的。然后再把有序子序列合并为团体有序序列。
否是定稳:定稳。
时间复杂度:O(n*logn)。
void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i]; } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左边有序 mergesort(a, mid + 1, last, temp); //右侧有序 mergearray(a, first, mid, last, temp); //再将二个有序数列合并 } } bool MergeSort(int a[], int n) { int *p = new int[n]; if (p == NULL) return false; mergesort(a, 0, n - 1, p); delete[] p; return true; }
注:文中分部代码考参了其他博文。
文章结束给大家分享下程序员的一些笑话语录: 问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?
答:因为李艳红这种败类,所以我没女友!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/32172.html