十种内部排序实现(选择,冒泡,插入,希尔,堆,归并,快速,基

1. 选择排序

这个排序方法最简单,废话不多说,直接上代码:

{/*** 选择排序* 思路:每次循环得到最小值的下标,然后交换数据。* 如果交换的位置不等于原来的位置,则不交换。*/(String[] args) {selectSort(Datas.data);Datas.prints(“选择排序”);}(int[] data){int index=0;for (int i = 0; i < data.length; i++) {index = i;for (int j = i; j < data.length; j++) {if (data[index]>data[j]) {index = j;}}if (index != i) {swap(data,index,i);}}}(int[] data,int i,int j){int temp = data[i];data[i] = data[j];data[j] = temp;}}

选择排序两层循环,第一个层循环遍历数组,第二层循环找到剩余元素中最小值的索引,内层循环结束,交换数据。内层循环每结束一次,排好一位数据。两层循环结束,数据排好有序。

2 冒泡排序 冒泡排序也简单,上代码先:

{/*** 冒泡排序* 思路:内部循环每走一趟排好一位,依次向后排序*/(String[] args) {bubbleSort(Datas.data);}(int[] data) {int temp;for (int i = 0; i < data.length; i++) {for (int j = i+1; j < data.length; j++) {if (data[i]>data[j]) {temp =data[i];data[i]=data[j];data[j] = temp;}}}Datas.prints(“冒泡排序”);}}

冒泡排序和选择排序有点像,两层循环,内层循环每结束一次,排好一位数据。不同的是,数据像冒泡一样,不断的移动位置,内层循环结束,刚好移动到排序的位置。

该图对应上面的代码进行的说明,没有用专门的画图工具,使用的是window的maspint,大家凑合着看哈^_^明白意思就成!

3 插入排序 插入排序也是简单的排序方法,代码量不多,先看代码:

{/*** 插入排序* 思路:将数据插入到已排序的数组中。*/(String[] args) {int[] data = Datas.data;int temp;for (int i = 1; i < data.length; i++) {temp = data[i];//保存待插入的数值int j = i;for (; j>0 && temp<data[j-1]; j–) {data[j] = data[j-1];//如果带插入的数值前面的元素比该值大,就向后移动一位}//内部循环结束,找到插入的位置赋值即可。data[j]=temp;}Datas.prints(“插入排序”);}}

该图是上面插入排序的说明图,插入排序,其过程就是其名字说明的一样,将待排序的数据插入到已排序的数据当中。两层循环,内层循环结束一次,插入排序排好一位数据。

4 希尔排序 希尔排序,也叫缩减增量排序,其中增量的设置影响着程序的性能。最好的增量的设置为1,3,5,7,11,。。。这样一组素数,并且各个元素之间没有公因子。这样的一组增量 叫做Hibbard增量。使用这种增量的希尔排序的最坏清醒运行时间为θ(

) 当不使用这种增量时,希尔排序的最坏情形运行时间为θ(

这里电脑打印这些太麻烦,干脆手写拍照啦哈哈哈哈。。。。。 好了,废话不多说,上代码;

{/*** 希尔排序(缩减增量排序)* 想想也不难。* 思路:三层循环* 第一层循环:控制增量-增量随着程序的进行依次递减一半* 第二层循环:遍历数组* 第三层循环:比较元素,交换元素。* 这里需要注意的是:比较的两个元素和交换的两个元素是不同的。*/(String[] args) {int[] data = Datas.data;int k;for (int div = data.length/2; div>0; div/=2) {for (int j = div; j < data.length; j++) {int temp = data[j];for (k=j; k>=div && temp<data[k-div] ; k-=div) {data[k] = data[k-div];}data[k] = temp;}}Datas.prints(“希尔排序”);}}

程序中,需要注意的是第三层循环,第三层循环的代码中,if语句的比较和内部的交换是分别不同的两个数据。原因是:把大的数据后移,小的数据前移,形成这样一种趋势,才能实现排序。 当然可以试试,if语句比较的两个数据和内部移动的数据一致的话,会出现什么问题?出现的问题就是移动的数据打破了之前形成的大的数据在后,小的数据在前的趋势。无法排序。

5 堆排序

堆排序,要知道什么是堆?说白了,堆就是完全二叉树,堆是优先队列。要求父元素比两个子元素要大。这就好办了。数组元素构建堆,根节点最大,删除根节点得到最大值,剩下的元素再次构建堆,接着再删除根节点,得到第二大元素,剩下的元素再次构建堆,依次类推,得到一组排好序的数据。为了更好地利用空间,我们把删除的元素不使用新的空间,而是使用堆的最后一位保存删除的数据。 代码上来:

{/*** 堆排序(就是优先队列)* 也就是完全二叉树* 第一步:建堆.其实就是讲数组中的元素进行下虑操作,*使得数组中的元素满足堆的特性。* 第二步:通过将最大的元素转移至堆的末尾,*然后将剩下的元素在构建堆。*完成排序。* 最重要的过程就是构建堆的过程。* 里面的比较思路和希尔排序中的比较思路一致。* 将大的元素上浮,小的元素下浮。始终和temp比较。* temp除了第一次比较可能改变外,其他次数的比较不改变该值。* 这样的处理就是让较大的元素趋于上浮,较小的元素下浮。*/(String[] args) {int[] data = Datas.data;for (int i = data.length/2; i >=0; i–) {buildHeap(data,i,data.length);}Datas.prints(“堆排序-构建树”);System.out.println(“============================”);for (int i = data.length-1; i>0; i–) {swap(data, 0, i);buildHeap(data, 0, i);}Datas.prints(“堆排序-排序后”);}static void swap(int[] data,int i,int j){int temp = data[i];data[i] = data[j];data[j] = temp;}static void buildHeap(int[] data,int i,int len){int leftChild = leftChild(i);int temp = data[i];for (; leftChild<len;) {if (leftChild != len-1 && data[leftChild]<data[leftChild+1]) {leftChild++;}if (temp<data[leftChild]) {data[i] = data[leftChild];}else {/**braek说明两个儿子都比父节点小,* 父节点大于两个儿子* 所以直接停止比较,减小比较的次数。*/break;}i = leftChild;leftChild = leftChild(i);}data[i] = temp;}leftChild(int i){return 2*i+1;}}如果没法忘记他,就不要忘记好了。真正的忘记,是不需要努力的。

十种内部排序实现(选择,冒泡,插入,希尔,堆,归并,快速,基

相关文章:

你感兴趣的文章:

标签云: