1. 几种排序算法的流程图
网上可以搜到的啊。。
2. C/C++/C#/Java高手进!求排序算法动画!
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.2.2.1.htm
3. 几种排序算法
冒泡,快排,桶排序
4. 快速排序算法的排序演示
假设用户输入了如下数组: 下标 0 1 2 3 4 5 数据 6 2 7 3 8 9 创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据的值)。
我们要把所有比k小的数移动到k的左面,所以我们可以开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,我们找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3,完成第一次比较: 下标 0 1 2 34 5 数据 3 2 7 6 8 9 i=0 j=3 k=6
接着,开始第二次比较,这次要变成找比k大的了,而且要从前往后找了。递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据的6做交换,数据状态变成下表: 下标 0 1 2 3 4 5 数据 3 2 6 7 8 9 i=2 j=3 k=6
称上面两次比较为一个循环。
接着,再递减变量j,不断重复进行上面的循环比较。
在本例中,我们进行一次循环,就发现i和j“碰头”了:他们都指向了下标2。于是,第一遍比较结束。得到结果如下,凡是k(=6)左边的数都比它小,凡是k右边的数都比它大: 下标 0 1 2 3 4 5 数据 3 2 6 7 8 9 如果i和j没有碰头的话,就递加i找大的,还没有,就再递减j找小的,如此反复,不断循环。注意判断和寻找是同时进行的。
然后,对k两边的数据,再分组分别进行上述的过程,直到不能再分组为止。
注意:第一遍快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。 在c++中可以用函数qsort()可以直接为数组进行排序。
用 法:
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数:1 待排序数组首地址2 数组中待排序元素数量3 各元素的占用空间大小4 指向函数的指针,用于确定排序的顺序
5. 排序的算法有哪些
我记得之前的数据结构书上的:插入排序,合并排序,冒泡排序,选择排序,快速排序,还有一些其它的不常用。
6. 几个简单的排序算法
现在诸如:冒泡排序(最简单的)、选择排序、堆排序、SHELL排序、快速排序、归并排序等各种排序算法,在各类数据结构教材上都已经有了 C 语言版的子函数实现代码,当然了,这个数据类型是一个抽象的数据类型,其实在使用时只需要在调用函数入口处,将调用形参修改为适合自己的数据类型即可。
7. 几种常用排序算法
/** * @author txin0814 E-mail:[email protected] * @version 1.0 * @date Apr 1, 2011 2:28:06 PM * @description 排序类的 基类 */ public abstract class BaseSorter { public abstract void sort(E[] array,int from,int len); public final void sort(E[] array){ sort(array,0,array.length); } protected final void swap(E[] array,int from,int to){ E temp = array[from]; array[from] = array[to]; array[to] = temp; } } /** * @author txin0814 E-mail:[email protected] * @version 1.0 * @date Apr 1, 2011 2:34:47 PM * @description 插入排序 该算法在数据规模小的时候十分高效, * 该算法每次插入第K+1到前K个有序数组中一个合适位置, * K从0开始到N-1,从而完成排序 */ public class InsertSorter extends BaseSorter{ //当SORT_TYPE为false时按降序排列 为TRUE时按升序排列 public static boolean SORT_TYPE = false; @Override public void sort(E[] array, int from, int len) { E tmp=null; for(int i=from+1;ifrom;j--){ if(SORT_TYPE){ if(tmp.compareTo(array[j-1])0){ array[j]=array[j-1]; }else break; } } array[j]=tmp; } /*for (E e : array) { System.out.println(e); }*/ } public static void main(String[] args) { Integer[] elem = {32, 43, 1, 3, 54, 4, 19}; InsertSorter insertsort = new InsertSorter(); //InsertSorter.SORT_TYPE = true; insertsort.sort(elem); for (Integer integer : elem) { System.out.println(integer); } } } /** * @author txin0814 E-mail:[email protected] * @version 1.0 * @date Apr 1, 2011 2:53:29 PM * @description 冒泡排序 算法思想是每次从数组末端开始比较相邻两元素,把第i小的冒泡到数组的第i个位置。) */ public class BubbleSorter extends BaseSorter { //当SORT_TYPE为false时按降序排列 为TRUE时按升序排列 public static boolean SORT_TYPE = false; public final void bubble_down(E[] array, int from, int len) { for (int i = from; i < from + len; i++) { for (int j = from + len - 1; j > i; j--) { if (array[j].compareTo(array[j - 1]) > 0) { swap(array, j - 1, j); } } } } public final void bubble_up(E[] array, int from, int len) { for (int i = from + len - 1; i >= from; i--) { for (int j = from; j < i; j++) { if (array[j].compareTo(array[j + 1]) > 0) { swap(array, j + 1, j ); } } } } @Override public void sort(E[] array, int from, int len) { if (SORT_TYPE) { bubble_up(array, from, len); } else { bubble_down(array, from, len); } } public static void main(String[] args) { Integer[] elem = {32, 43, 1, 3, 54, 4, 19}; BubbleSorter bsort = new BubbleSorter(); //BubbleSorter.DWON = true; //bsort.sort(elem); //BubbleSorter.SORT_TYPE = true; bsort.sort(elem, 0, elem.length); for (Integer integer : elem) { System.out.println(integer); } } } /** * @author txin0814 E-mail:[email protected] * @version 1.0 * @date Apr 1, 2011 3:17:42 PM * @description 选择排序 选择排序相对于冒泡来说,它不是每次发现逆序都交换, * 而是在找到全局第i小的时候记下该元素位置,最后跟第i个元素交换,从而保证数组最终的有序。