第一讲:排序的原理以及代码的实现
排序算法原理:
(1) 选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序 方法。
(2)冒泡排序:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序
代码的实现过程:
/*
以下为选择排序算法
*/
class selectSort{
publicstaticvoid sort (int arr[]){
for(int x=0;x<arr.length-1;x++){
for(int y=x+1;y<arr.length;y++){//开始arr[y]为数组第二个元素.以后每排序
if(arr[x]>arr[y]){//一次,获取arr[y]及以后数组最大的一个,
int temp;//作为arr[x]的值,然后将Y后移一位,直到遍历完
temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
}
}
}
publicstaticvoid printarr(int[] arr){
for(int x=0;x<arr.length-1;x++){
if(x!=arr.length){
System.out.print(arr[x]+",");
}
}
}
publicstaticvoid main(String[] args) {
int[] arr={1,4,6,8,5,9};
printarr(arr); System.out.println();
sort(arr);
printarr(arr);
}
}
/*
以下为冒泡排序算法
*/
class bubbleSort{
publicstaticvoid sort (int arr[]){
for(int x=0;x<arr.length;x++){
for(int y=0;y<arr.length-x-1;y++){//-x:每一次比较元素减少,-1:避免角标出界
if(arr[x]>arr[y]){
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
}
}
}
publicstaticvoid printarr(int[] arr){//打印数组的函数
for(int x=0;x<arr.length-1;x++){
if(x!=arr.length){
System.out.print(arr[x
}
}
}
publicstaticvoid main(String[] args) {
int[] arr={1,4,6,8,5,9};//打印未排序之前的数
printarr(arr); System.out.println();
sort(arr); //打印排序后的数
printarr(arr);
}
}
第二讲:排序算法的分析
(1)排序算法的效率分析
1.选择排序每一次从序列中选出一个最小的数出来,放在已经排好序列的后面,待排序的数减少一个,设需要排序的元素个数为N,则共需要N+N-1+N-2+N-3+.......
+2+1,共需要N(N+1)/2次排序
2.冒泡排序:每一次从元素的第一个开始,与相邻的元素比较,每一次比较把较大的数放在两个相邻的数后面,一轮比较下来,最大的数排到序列的最后,然后从序列的
第二个元素开始重复第一次比较的规则排序,这样,剩余最大的数排在元素倒数第二个位置,重复下去,直到最后一个排序完,设需要排序的元素个数为N,则共需要N+
N-1+N-2+N-3+....... +2+1,共需要N(N+1)/2次排序
(2)排序算法实现方式大同小异,但是在不同场合下,选择不同的排序方式会使排序效率更高,例如在升序占多的元素中,选择冒泡排序效率更高,因为每次排序多数情况下, 不需要调换元素的位置