快速排序

算法来源:
1.C语言:啊哈算法 
2.Java:漫画算法:小灰的算法之旅

C语言实现

/*
*加入自己的理解,有问题可以评论指出,欢迎交流
*/

#include<stdio.h>

int a[100],n;  //定义全局变量需要在子函数中使用

void quicksort(int left,int right)    
{
	int i,j;    //检索的坐标 
	int t;		//相遇时候交换的临时变量 
	int temp;   //i<j时候,临时变量 
	
	//递归结束条件 
	if(left>right){      //函数的左右值,如果不符合,返回空,跳出 
		return ;
	}

	temp = a[left];  /************temp中存放的就是基准数,后边用得到*********************/
	i=left;          //从最左开始 
	j=right;		 //最右端开始 
	
	while (i != j)   //进行比较 
	{
		//顺序很重要,要从右往左找
		while(a[j] >= temp && i<j){  //要找一个比基准小的,然后找到就跳出 
			j--;
		}
		
		//再从左往右找 
		while(a[i] <= temp && i<j){  //找一个比基准大的 
			i++;
		} 
				
		//交换两个数再数组中的位置
		if(i<j){  //当少冰i和j没有相遇时候 
			t=a[i];
			a[i] = a[j];
			a[j] = t; 
		} 
	 } 
	
	//最终将基准数归位 ,因为最后是 i 去逼近 j ,然后j=i, 所以是将a[j]的值就是小于a[left]的值,然后i=j,所以需要和基准交换 
	a[left] = a[i];         /**这里是进行交换,将基准,也就是第一个和a[i](这个小于基准的数放最前边)**/ 
	a[i] = temp;            //临时变量就是基准数,由上边if语句后边得到 
	
	//递归的思想 
	quicksort(left,i-1);
	quicksort(i+1,right); 	
 } 


int main()
{
	//i的值从1开始的 
	int i,j,t;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
			
	quicksort(1,n);
	
	for(i=1;i<=n;i++)
		printf("%d ",a[i]);
		
	return 0;
 } 

Java实现

public static void quickSort(int[] arr, int startIndex,
int endIndex) {
// 递归结束条件:startIndex大于或等于endIndex时
if (startIndex >= endIndex) {
	return;
}
// 得到基准元素位置
int pivotIndex = partition(arr, startIndex, endIndex);
// 根据基准元素,分成两部分进行递归排序
quickSort(arr, startIndex, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, endIndex);
}
 
  /**
  * 分治(双边循环法)
  * @param arr 待交换的数组
  * @param startIndex 起始下标
  * @param endIndex 结束下标
  */
private static int partition(int[] arr, int startIndex,
int endIndex) {
 // 取第1个位置(也可以选择随机位置)的元素作为基准元素
int pivot = arr[startIndex];
int left = startIndex;
int right = endIndex;

while( left != right) {
//控制right 指针比较并左移
while(left<right && arr[right] > pivot){
	right--;
}
 //控制left指针比较并右移
while( left<right && arr[left] <= pivot) {
	left++;
}
	//交换left和right 指针所指向的元素
	if(left<right) {
	int p = arr[left];
	arr[left] = arr[right];
	arr[right] = p;
    }
}

//pivot 和指针重合点交换
arr[startIndex] = arr[left];
arr[left] = pivot;

	return left;
}

 public static void main(String[] args) {
 int[] arr = new int[] {4,4,6,5,3,2,8,1};
 quickSort(arr, 0, arr.length-1);
 System.out.println(Arrays.toString(arr));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值