B:快速排序 现在开始,我们要接触高效排序算法了.实践证明,快速排序是所有排序算法中最高效的一种.它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了.这是一种先进的思想,也是它高效的原因.各个算法时间复杂度比较: 平均时间复杂度 插入排序 O(n2) 冒泡排序 O(n2) 选择排序 O(n2) 快速排序 O(n log n) 堆排序 O(n log n) 归并排序 O(n log n) 基数排序 O(n) 希尔排序 O(n1.25)。
首先我赞成你直接要代码的这种方法。
从你这个提问可以看出你对常用的排序算法都接触过,并且都没搞懂到底是怎么回事。
现在的电子平台资源都很丰富了,硬件平台的运行速度可以做到很高了,在大多数的情况下可以考虑用空间换时间的方法,也就是说你应该先搞懂算法的本质,然后再自己去实现它,开始的时候可以不考虑时间上的损耗。
排序的本质就是两个数比较大小,并根据其大小将其放到相应的位置。
记住其本质是什么,你自己绝对可以使用相应的语言实现它。
public class QuickSort
{
public static void main(String[] args)
{
int []array={3,1,2};
quickSort(array,0,2);
for(int i:array)
System.out.println(i);
}
public static void quickSort(int[] arr, int l, int r) // 分划交换排序,快速排序
{
if (l >= r) // 递归出口
return;
int i, j, k;
int t;
k = arr[l];
i = l;
j = r + 1;
while (i {
do
{
i++;
}
while (ido
{
j--;
}
while (j>=0 && arr[j] >k);
if (i {
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
t = arr[l]; // 最左边的关键词放到它最终的位置
arr[l] = arr[j];
arr[j] = t;
quickSort(arr, l, j - 1); // 递归排序左边和右边
quickSort(arr, j + 1, r);
}
}
BOOL QuickSort(U16*p,int num)
{
int i;
int n_small=1,n_big=num-1;//升序
U16 m_key=p[0];
BOOL xiaokong=true;//小头有空
int m_free = 0;
if(num<=1)return true;///递归终止条件
for(i=0;i { if(xiaokong)//小头有空 { if(p[n_big] { p[m_free]=p[n_big]; m_free=n_big; xiaokong=false; } n_big--; } else//大头有空 { if(p[n_small]>m_key) { p[m_free]=p[n_small]; m_free=n_small; xiaokong=true; } n_small++; } } if(m_free != 0) { p[m_free]=m_key; } //printf("num=%d[", num); //for( i = 0; i< num; i++) printf("%d,", p[i]); //printf("]key=%d, mid = %d, small=%d, big=%d, from %d num %d && from %d num %d\n", // m_key, m_free, n_small, n_big, 0,m_free, m_free+1, num-(m_free+1) ); if(QuickSort(&p[0],m_free) && QuickSort(&p[m_free+1],num-(m_free+1) ) ) { return true; } return false; } void QuickSortTest(void) { int i; U16 sortTest[20] = {23,4,6,9,5,7,4,12,12,23,4,9999,89,1000,1000,4,2334,989,12,20}; U16 sortTest2[10] = {10,9,8,7,6,5,4,3,2,1}; U16 sortTest3[10] = {0,1,2,3,4,5,6,7,8,9}; for( i = 0; i<20; i++) printf("%d,",sortTest[i]); printf("\n"); QuickSort( sortTest, 20); for( i = 0; i<20; i++) printf("%d,",sortTest[i]); printf("\n"); for( i = 0; i<10; i++) printf("%d,",sortTest2[i]); printf("\n"); QuickSort( sortTest2, 10); for( i = 0; i<10; i++) printf("%d,",sortTest2[i]); printf("\n"); for( i = 0; i<10; i++) printf("%d,",sortTest3[i]); printf("\n"); QuickSort( sortTest3, 10); for( i = 0; i<10; i++) printf("%d,",sortTest3[i]); printf("\n"); }