一:快速排序的编程思想,写代码前的思考,这种排序方式比冒泡排序的时间复杂度要小很多
分析如下:
5,6,8,7,2,9,1,3,4
i=0j=8
4,6,8,7,2,9,1,3,5
4,5,8,7,2,9,1,3,6
4,3,8,7,2,9,1,5,6
4,3,5,7,2,9,1,8,6
4,3,1,7,2,9,5,8,6
4,3,1,5,2,9,7,8,6
4,3,1,2,5,9,7,8,6
此时arr1<flag<arr2成立
然后arr1和arr2再次进行上述操作
数组长度为n
设计一个套路,具体一步一步完成它
1、设置两个变量i,j,在排序开始的时候i=0,j=n-1
2、以数组的第一个元素,作为flag,flag=a[0]
3、从j开始向前搜索,j--,找到第一个比flag小的,让a[i]和a[j]交换。
4、从i开始向后搜索,i++,找到第一个比flag大的,让a[i]和a[j]交换。
5、重复3~4的过程,知道i与j相遇为止。
6、把分裂开的arr1和arr2,都重复上述过程,知道全部都只剩1个元素为止。
用JavaScript实现上述:
var arr = new Array(5,6,8,7,2,9,1,3,4);
//排序,array是要被排序的数组,
//start和end是表示对那个数组进行排序
function f(arr,start,end){
//相遇就就结束
if(start==end){
return;
}
var n=start; //将start最原始的标记副歌n
var m=end; //将end最原始的标记赋值给一个数
//开始排序逻辑
while(start != end){
//从后向前找
for(;start<end;end--){
if(arr[start] > arr[end]){
var temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
break;
}
}
//从前向后找
for(;start<end;start++){
if(arr[start] > arr[end]){
var temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
break;
}
}
}
//进不去while循环,就是start==end,即数组被分成了两个部分,接着这样排序
//两部分为start-n 和 m-end;
if(start - 1>n){
f(arr,n,start-1);
}
if(m-1>end){
f(arr,end+1,m);
}
}
f(arr,0,arr.length-1);
public class Kssort {
/**
* @param args
*/
public static void main(String[] args) {
int[] arr = {5,6,8,7,2,9,1,3,4};
fun(arr, 0, arr.length-1);
for(int num:arr){
System.out.print(num + " ");
}
}
//start 和 end 是规定的两个标志位
public static int[] fun(int[] arr,int start,int end){
int n=start;
int m = end;
//开始按逻辑走,先从后往前遍历,载再从前往后遍历,start++,和end--,
//知道start==end为止
while(start != end){
for(;start<end;end--){
if(arr[start] > arr[end]){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
break;
}
}
for(;start<end;start++){
if(arr[start] > arr[end]){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
break;
}
}
}
//进不去while循环,就说明start==end 此时数组被分为两部分
if(start-1>n){
fun(arr, n, start-1);
}
if(end+1<m){
fun(arr, end+1, m);
}
return arr;
}
}
// TODO Auto-generated method stub
int[] arr = {5,6,8,7,2,9,1,3,4};
for(int i=0;i<arr.length-1;i++){
for(int j=0; j< arr.length-1-i;j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] =temp;
}
}
}
for(int num:arr){
System.out.print(num+" ");
}
var arr = new Array(5,6,8,7,2,9,1,3,4);
for(var i=0;i<arr.length-1;i++){
for(var j=0; j< arr.length-1-i; j++){
if(arr[j] > arr[j+1]){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
document.write(arr)
</script>
三、选择排序:
用Java代码实现:
int[] arr = {5,6,8,7,2,9,1,3,4};
for(int i=0; i< arr.length-1;i++){
for(int j =i+1; j < arr.length; j++){
if(arr[i] > arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for(int num:arr){
System.out.print(num+" ");
}
用JavaScript实现:
<script type="text/javascript">
var arr = new Array(5,6,8,7,2,9,1,3,4);
for(var i=0;i<arr.length-1;i++){
for(var j=i+1; j< arr.length; j++){
if(arr[i] > arr[j]){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
document.write(arr)
</script>