(2)选择法 选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j,最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。 void choise(int *a,int n ) { int i,j,temp; for(i = 0;i<n-1;i++) { k = i; /*给记号赋值*/ for(j = i+1;j<n;j++) { if(a[k]>a[j]) k = j; /*k总是指向最小元素*/ if(i!=k) { temp = a[i]; a[i] = a[k]; a[k] = temp; } } } } 选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。 (3)快速法 快速法定义了三个参数,(数组地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j),它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的元素放在它的右边,然后在运用递归,再将它左、右两个子数组排序,最后完成整个数组的排序。 void quick(int *a,int i,int j) { int m,n,temp; int k; m = i; n = j; k = a[(m+n)/2]; do { while (a[m]<k&&m<j) { m++; } while (a[n]>k&&n>i) { n--; } if (m<n) { temp = a[m]; a[m] = a[n]; a[n] = temp; m++; n--; } } while (m<n); if (m<j) { quick(a,m,j); } if (n>i) { quick(a,i,n); } } |
|